我在DB中有两个表与OneToMany关系。在'EntityRepository'中使用'createQueryBuilder()'方法,我尝试选择一些有条件的对象。有我的方法:
$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 :(得分:0)
你可以尝试这样的事情:
$query = $this->getEntityManager()->createQueryBuilder();
$query->select("parent")
->from('TestAppBundle:Parent', 'parent')
->leftJoin("parent.children", 'child', 'WITH', 'child.status = 0');
答案 1 :(得分:0)
基本上,如果您在查询时没有选择实体,那么在调用getChildren()时,您将懒惰地为父项加载所有子项。选择这样的子项和父项以避免延迟加载:
$query->select("parent, child")
有关详细信息,请参阅my answer to a similar question。
答案 2 :(得分: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);
问候。