Symfony 2 OneToMany отношения — неправильные результаты в ассоциации

У меня есть две таблицы в БД с отношениями 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. Методы выбирают родительские объекты с условиями, но проблема в том, что я получаю также дочерние объекты, которые не выполняют условия.
Я хочу получить только родительские объекты, которые сохраняют условия, и дочерние объекты, которые также поддерживают условия. В настоящее время необходимо отфильтровать результаты после запроса и вручную удалить дочерний объект.
Я надеюсь, вы поймете проблему 🙂

0

Решение

По сути, если вы не выберете объекты во время запроса, вы будете лениво загружать все дочерние элементы для родителя, когда вызываете getChildren (). Выберите как детей, так и родителей, чтобы избежать ленивой загрузки:

$query->select("parent, child")

Для получения дополнительной информации см. мой ответ на аналогичный вопрос.

0

Другие решения

Не могли бы вы попробовать что-то вроде этого:

$query = $this->getEntityManager()->createQueryBuilder();
$query->select("parent")
->from('TestAppBundle:Parent', 'parent')
->leftJoin("parent.children", 'child', 'WITH', 'child.status = 0');
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);

С уважением.

0
По вопросам рекламы [email protected]