2

我有大胖 QueryBuilder 生成像这个问题中的 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如果需要它可以是一个孩子。

4

2 回答 2

2

无法仅重置某些联接。

我在这里找到了一些讨论,建议的解决方案(虽然没有提供源代码)是覆盖 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
于 2013-08-08T08:03:29.817 回答
1

您可以使用查询生成器中的“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);
    }
于 2020-07-22T13:48:13.310 回答