Doctrine, связанные объекты и ограничение вывода

scorpion-ds

Новичок
Не понимаю, почему я раньше не сталкивался с такой проблемой ...

Столкнулся с проблемой, что если делаю запрос в репозитории к таблице у которой есть связи и связанные объекты явно запрашиваются, то ограничение setMaxResults действует не только на родителя, но и на дочерние объекты. К примеру, если Messages в выборке у меня 10, но есть еще дочерние объекты MessageCustomer, которых скажем 3 на все Messages, то я получу только 7 результатов по родительскому объекту. Я не понимаю почему setMaxResults действует на все связанные сущности, а не только на родительскую.

Если я уберу явную связь и будет использоваться "ленивая загрузка", то будет масса лишних запросов, но все будет работать как надо.

Фрагмент кода, он порезан немного, что бы не отвлекать от сути вопроса:
PHP:
public function getMessagesAccount(
        Account $account,
        array $filters = [],
        string $search = null,
        string $sortField = null,
        string $sortOrder = null,
        int $offset = 0,
        int $limit = null,
        bool $notActivity = null,
        int $customerId = null,
        bool $isOpen = null,
        bool $isDownloaded = null,
        $hydrationMode = AbstractQuery::HYDRATE_OBJECT
    )
    {
        $qb = $this->createQueryBuilder('m')
            ->select('m')
        ;
        
        $qb
            ->innerJoin('CPMessageBundle:MessageCustomer', 'mc', 'WITH', 'mc.message = m.id')
            //->join('CPCustomerBundle:Customer', 'c', 'WITH', 'c.id = mc.customer')
            //->leftJoin('CPDocumentBundle:Link', 'l', 'WITH', 'l.messageCustomer = mc.id')
            //->leftJoin('CPFilesBundle:FileLink', 'fl', 'WITH', 'fl.messageCustomer = mc.id')
            //->leftJoin('CPUrlBundle:UrlLink', 'url_link', 'WITH', 'url_link.messageCustomer = mc.id')
        ;

        $qb
            ->where($qb->expr()->eq('m.account', ':account'))
            ->setParameter('account', $account->getId())
        ;

        // Filters <<
        $this->andFilters($qb, 'm', $filters);
        // Filters >>

        // Sorting <<
        $this->sorting($qb, 'm', $sortField, $sortOrder);
        // Sorting >>

        if(!empty($limit))
        {
            $qb
                ->setFirstResult($offset)
                ->setMaxResults($limit)
            ;
        }
        
        return $qb->getQuery()->getResult($hydrationMode);
 

scorpion-ds

Новичок
Заработался, забыл добавить:
$qb->groupBy('m');

Так ограничение действует как следует, но при таком подходе используется ленивая загрузка, а отсюда куча запросов, прям хоть сам делаем запрос по старике и выводи ...
 

scorpion-ds

Новичок
В общем я или плохо понимаю ORM или переоценил ее возможности, по подгрузки дочерних объектов, что бы не использовать "ленивую загрузку", решил сам готовить "справочники" с этими данными, а уже в "декораторе" подставлять их вместо "ленивого запроса", так вместо количества запросов равному количеству родительских объектов будет только один запрос.
 
Сверху