Symfony 2 OneToMany关系 - 关联结果错误

时间:2014-12-09 12:19:59

标签: php symfony doctrine-orm relational-database

我在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中获得带有子对象的父对象。方法选择具有条件的父对象,但问题是我得到的子对象不保留条件。 我想只获得保持条件的父对象和保持条件的子对象。此时必须在查询后过滤结果并手动删除子对象。 我希望你能理解这个问题:)

3 个答案:

答案 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);

问候。