Множественное соединение Doctrine2 работает с createQuery, но не с queryBuilder.

Если я использую запрос без queryBuilder с этим dql

$query = $this->_em
  ->createQuery("SELECT p, g, c
            FROM LikeYeah\GoBundle\Entity\Product p
            JOIN p.garments g
            LEFT JOIN g.colours c
            ORDER BY p.id DESC
          ");

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

 $qb->select('p, g, c')
    ->from('LikeYeah\GoBundle\Entity\Product', 'p')
    ->join('p.garments', 'g')
    ->leftJoin('g.colours', 'c')
    ->orderBy('p.id', 'desc');

Я получаю следующую ошибку:

"Семантическая ошибка] строка 0, столбец 66 рядом с '.colours c, LikeYeah\GoBundle\Entity\Product': ошибка: переменная идентификации g используется в выражении пути соединения, но не была определена ранее."

Что мне не хватает?


person Marko Jovanović    schedule 04.02.2012    source источник
comment
Я не вижу «присоединения» в документации, есть только «leftJoin» и «innerJoin». Возможно, проблема в том, что ваше «соединение» на самом деле является левым соединением, и для некоторых строк оно не определяет «g», потому что не к чему присоединяться....   -  person Wojciech Jasiński    schedule 05.02.2012
comment
Войцех, это не так, QueryBuilder имеет метод с именем join(), который в основном является псевдонимом innerJoin().   -  person Quentin    schedule 06.02.2012


Ответы (5)


Попробуйте это: используя addSelect после ваших соединений:

 $qb->select('p')
    ->join('p.garments', 'g')
    ->addSelect('g')
    ->from('LikeYeah\GoBundle\Entity\Product', 'p')
    ->join('p.garments', 'g')
    ->leftJoin('g.colours', 'c')
    ->addSelect('c')
    ->orderBy('p.id', 'desc');
person Lighthart    schedule 06.02.2015

Вы можете помочь этим методом

 public function findSampleClothingTypeGender($gender) {
        $query = $this->getEntityManager()
                        ->createQuery('
            SELECT p FROM Acme:Product p 
            JOIN p.clothing_type ct
            WHERE p.gender = :gender'
                        )->setParameter('gender', $gender);

        try {
            return $query->getResult();
        } catch (\Doctrine\ORM\NoResultException $e) {
            return null;
        }
    }
person Suresh Kumar Amrani    schedule 29.04.2013

Попробуйте с ниже одного

 $qb->select('p','g','c')
      ->from(array('LikeYeah\GoBundle\Entity\Product','p'))
      ->join(array('p.garments','g'))   
      ->join(array('g.colours','c'),'LEFT')
      ->order_by('p.id','DESC'); 
person Siva    schedule 08.12.2018

можно попробовать

  $qb->select('p, g, c')
     ->from('GoBundle:Product', 'p')
     ->join('p.garments', 'g')
     ->leftJoin('g.colours', 'c')
     ->orderBy('p.id', 'desc');

покажите результат $qb init и DQL

person versh23    schedule 26.11.2012

Меня устраивает.

$this->_em->createQueryBuilder()
         ->select('fu,e,t')
         ->from('\xxxx\AdminBundle\Entity\FrontUser','fu')
         ->join('fu.read_essays','e')
         ->leftJoin('e.tags','t')
         ->getQuery()->execute();

Я думаю, вам следует создать новый объект QueryBuilder.

Вы можете использовать следующий код, чтобы увидеть Dql этого QueryBuilder

$qb->получитьDQL();

person bronze man    schedule 13.07.2013