Doctrine2:如何删除QueryBuilder的leftJoin部分

时间:2013-07-04 13:43:16

标签: doctrine-orm

我有一个胖胖的QueryBuilder,可以在this question中生成sql。显然,所有leftJoins都会让我的查询抓取。

所以我想我只需要获取与之匹配的ID,然后追加

$ids = $cloneOfqb->select("o.id")->resetDqlPart("join")....->getResult() ;

return $qb->andWhere("o.id IN (:ids)")->setParameter("ids", $ids)

问题:

这样可以很好地运行,但resetDqlPart("join")会删除leftJoininnerJoin的所有联接。我使用innerJoins很多,因为它使代码可读。有没有办法我只能重置leftJoins但是留下innerJoins?它不必是QueryBuilder对象,如果需要,它可以是Doctrine\ORM\Query之类的子项。

2 个答案:

答案 0 :(得分:2)

无法仅重置某些连接。

我发现了一些讨论here,并且建议的解决方案(尽管没有提供源代码)是覆盖Doctrine的QueryBuilder.php中的resetDqlPart()函数。

在该函数中转储$ this-> _dqlParts ['join'],连接的结构如下所示:(我的示例查询有一个内连接和一个左连接,'e','ed' ,'eaf'是表别名)

array (size=1)
  'e' => 
    array (size=2)
      0 => 
        object(Doctrine\ORM\Query\Expr\Join)[666]
          protected 'joinType' => string 'LEFT' (length=4)
          protected 'join' => string 'e.date' (length=6)
          protected 'alias' => string 'ed' (length=2)
          protected 'conditionType' => null
          protected 'condition' => null
          protected 'indexBy' => null
      1 => 
        object(Doctrine\ORM\Query\Expr\Join)[654]
          protected 'joinType' => string 'INNER' (length=5)
          protected 'join' => string 'e.area_formativa' (length=16)
          protected 'alias' => string 'eaf' (length=3)
          protected 'conditionType' => null
          protected 'condition' => null
          protected 'indexBy' => null

答案 1 :(得分:0)

您可以使用查询生成器中的“ getDqlPart('join')”来获取应用的联接,通过“ resetDqlPart('join')”将其重置,然后从数组中手动​​将其删除,然后通过方法“ add”再次添加。不太方便,但是可能。简短示例:

    $joinDqlPart = $queryBuilder->getDQLPart('join');
    $queryBuilder->resetDQLPart('join');

    unset($joinDqlPart['alias'][0]);

    foreach ($joinDqlPart['alias'] as $join) {
        $queryBuilder->add('join', [$join->getAlias() => $join], true);
    }