Doctrine Query Builder count ManyToMany

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

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

$this->repository->createQueryBuilder('offer')
            ->addSelect('COUNT(offer.files) as files')
            ->having('files > 1')
            ->getQuery()
            ->getResult();
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
4
0
1 479
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

The INNER JOIN keyword selects records that have matching values in both tables.

Тогда ты можешь:

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

Если вам не нужна сумма в результате, вы можете определить ее как СКРЫТЫЙ, изменив первую строку выше как:

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

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

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

SIZE(collection) - Return the number of elements in the specified collection

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

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

Другие вопросы по теме