Doctrine Query Builder рассчитывает ManyToMany - PullRequest
0 голосов
/ 15 октября 2018

У меня есть предложение сущности.Предложение имеет отношение ManyToMany к файлам.Теперь я хочу получить все предложения, которые имеют файлы -> Count (offer.files)> 0.

Я пробовал вот так, но не работает:

$this->repository->createQueryBuilder('offer')
            ->addSelect('COUNT(offer.files) as files')
            ->having('files > 1')
            ->getQuery()
            ->getResult();

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

На самом деле вам не нужно объединение.Для этого в Doctrine имеется функция SIZE DQL .

SIZE (collection) - возвращает количество элементов в указанной коллекции

Так что вы можете использовать это так:

$this->repository->createQueryBuilder('offer')
    ->addSelect('SIZE(offer.files) as files')
    ->having('files > 1')
    ->getQuery()
    ->getResult();
0 голосов
/ 15 октября 2018

Вам необходимо внутреннее объединение с ассоциацией и группировка по корневому объекту предложения:

->innerJoin('offer.files', 'files')

Ключевое слово INNER JOIN выбирает записи, которые имеют совпадающие значения в обеих таблицах.

Тогда вы можете:

->addSelect('COUNT(files) as total')
->having('total > 1')
->groupBy('offer')

Если вам не нужна сумма в результате, вы можете определить еекак HIDDEN , измените 1-ю строку выше как:

->addSelect('COUNT(files) as HIDDEN total')

Подробно о внутреннем объединении Построитель запросов доктрины

...