Doctrine orm Doctrine2:如何删除QueryBuilder的leftJoin部分
我有一个大而胖的QueryBuilder,它可以像中一样生成sql。显然,所有这些leftjoin都让我的查询无法爬行 所以我想我只需要获取与之匹配的ID,然后再追加Doctrine orm Doctrine2:如何删除QueryBuilder的leftJoin部分,doctrine-orm,Doctrine Orm,我有一个大而胖的QueryBuilder,它可以像中一样生成sql。显然,所有这些leftjoin都让我的查询无法爬行 所以我想我只需要获取与之匹配的ID,然后再追加 $ids = $cloneOfqb->select("o.id")->resetDqlPart("join")....->getResult() ; return $qb->andWhere("o.id IN (:ids)")->setParameter("ids", $ids) 问题是: 这将很
$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对象,如果需要,它可以是类似于原则\ORM\Query
的子对象。无法仅重置某些联接
我发现了一些讨论,建议的解决方案(尽管没有提供源代码)是覆盖Doctrine的QueryBuilder.php中的resetDqlPart()函数
将$this->_dqlParts['join']转储到该函数中,联接的结构如下:(我的示例查询有一个内部联接和一个左联接,“e”、“ed”、“eaf”是表别名)
您可以使用查询生成器中的“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);
}
$joinDqlPart = $queryBuilder->getDQLPart('join');
$queryBuilder->resetDQLPart('join');
unset($joinDqlPart['alias'][0]);
foreach ($joinDqlPart['alias'] as $join) {
$queryBuilder->add('join', [$join->getAlias() => $join], true);
}