2013-07-04 2 views
2

У меня есть большой жир QueryBuilder, который генерирует sql, как в this question. По-видимому, все те, кто оставил меня, заставляют мой запрос сканировать.Doctrine2: как удалить leftJoin часть QueryBuilder

Так я полагал, что нужно получить только идентификаторы, которые соответствуют его, а затем добавьте

$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.

ответ

2

Невозможно сбросить только определенные соединения.

Я нашел небольшое обсуждение here, и предлагаемое решение (хотя исходный код не предоставляется) заключается в переопределении функции resetDqlPart() в QueryBuilder.php Doctrine.

Dumping $ 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 
Смежные вопросы