У меня есть две таблицы в БД с отношениями OneToMany. Используя метод createQueryBuilder () в EntityRepository, я пытаюсь выбрать некоторые объекты с условиями. Есть мой метод:
$query = $this->getEntityManager()->createQueryBuilder();
$query->select("parent")
->from('TestAppBundle:Parent', 'parent')
->leftJoin("parent.children", 'child', 'WITH', 'child.IdP = parent.id')
->where('child.date < :date')
->andWhere('child.status = :null')
->setParameter('date', new DateTime())
->setParameter('null', 0);
И это работает почти хорошо. Я получаю родительские объекты с дочерними объектами в ArrayCollections. Методы выбирают родительские объекты с условиями, но проблема в том, что я получаю также дочерние объекты, которые не выполняют условия.
Я хочу получить только родительские объекты, которые сохраняют условия, и дочерние объекты, которые также поддерживают условия. В настоящее время необходимо отфильтровать результаты после запроса и вручную удалить дочерний объект.
Я надеюсь, вы поймете проблему 🙂
По сути, если вы не выберете объекты во время запроса, вы будете лениво загружать все дочерние элементы для родителя, когда вызываете getChildren (). Выберите как детей, так и родителей, чтобы избежать ленивой загрузки:
$query->select("parent, child")
Для получения дополнительной информации см. мой ответ на аналогичный вопрос.
Не могли бы вы попробовать что-то вроде этого:
$query = $this->getEntityManager()->createQueryBuilder();
$query->select("parent")
->from('TestAppBundle:Parent', 'parent')
->leftJoin("parent.children", 'child', 'WITH', 'child.status = 0');
Насколько я понимаю ваши потребности, вы не должны использовать leftJoin
— с этим полем вы получите родителей, у которых нет детей. использование innerJoin
вместо.
Предполагая, что child.IdP ссылается на parent.id в определении модели, вам не нужно использовать предложение WITH таким образом. Таким образом, queryBuilder будет:
$query = $this->getEntityManager()->createQueryBuilder();
$query->select("parent")
->from('TestAppBundle:Parent', 'parent')
->innerJoin("parent.children", 'child')
->where('child.date < :date and child.status = :null')
->setParameter('date', new DateTime())
->setParameter('null', 0);
С уважением.