我有一个胖胖的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")
会删除leftJoin
和innerJoin
的所有联接。我使用innerJoins很多,因为它使代码可读。有没有办法我只能重置leftJoins但是留下innerJoins?它不必是QueryBuilder对象,如果需要,它可以是Doctrine\ORM\Query
之类的子项。
答案 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);
}