Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Doctrine orm Doctrine2:如何删除QueryBuilder的leftJoin部分_Doctrine Orm - Fatal编程技术网

Doctrine orm Doctrine2:如何删除QueryBuilder的leftJoin部分

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) 问题是: 这将很

我有一个大而胖的QueryBuilder,它可以像中一样生成sql。显然,所有这些leftjoin都让我的查询无法爬行

所以我想我只需要获取与之匹配的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对象,如果需要,它可以是类似于
原则\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);
    }