Symfony 2: INNER JOIN на не связанной таблице с построителем запросов доктрины

Я пытаюсь построить запрос с построителем запросов doctrine, который присоединяется к несвязанной таблице следующим образом:

$query = $this->createQueryBuilder('gpr') ->select('gpr, p') ->innerJoin('TPost', 'p') ->where('gpr.contentId = p.contentId') 

Но это не работает. Я все еще получаю сообщение об ошибке:

Ошибка: идентификационная переменная TPost, используемая в выражении пути соединения, но не была определена ранее.

Я искал это сообщение об ошибке, и все ответили, чтобы использовать атрибут table alias +, например p.someAttribute. Но таблица, которую я хочу присоединиться, не связана в таблице, с которой я начинаю свой выбор.

Как обычный mysql-запрос я бы написал его вот так:

 SELECT * FROM t_group_publication_rel gpr INNER JOIN t_post p WHERE gpr.content_id = p.content_id 

Любые идеи, что я делаю неправильно?

Сегодня я работал над подобной задачей и помнил, что открыл эту проблему. Я не знаю, с какой версии доктрины он работает, но прямо сейчас вы можете легко присоединиться к дочерним классам в наложении. Таким образом, такой запрос работает без проблем:

 $query = $this->createQueryBuilder('c') ->select('c') ->leftJoin('MyBundleName:ChildOne', 'co', 'WITH', 'co.id = c.id') ->leftJoin('MyBundleName:ChildTwo', 'ct', 'WITH', 'ct.id = c.id') ->orderBy('c.createdAt', 'DESC') ->where('co.group = :group OR ct.group = :group') ->setParameter('group', $group) ->setMaxResults(20); 

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

Поскольку это была большая проблема, когда я начал эту проблему, я думаю, что это может быть интересно и другим людям, которые не знают об этом.

 $dql = "SELECT a, md.fisrtName , md.LastName, mj FROM MembersBundle:Memberdata md INNER JOIN MembersBundle:Address a WITH md = a.empID INNER JOIN MembersBundle:Memberjob mj WITH md = mj.memberData ... WHERE a.dateOfChange IS NULL AND WHERE md.someField = 'SomeValue'"; return $em->createQuery( $dql )->getResult(); 

Соединения между объектами без ассоциаций не были возможны до версии 2.4, где вы можете сгенерировать произвольное соединение со следующим синтаксисом:

 $query = $em->createQuery('SELECT u FROM User u JOIN Blacklist b WITH u.email = b.email'); 

Ссылка: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

Соединение DQL работает только в том случае, если в вашем сопоставлении определена ассоциация. В вашем случае я бы сказал, что гораздо проще сделать собственный запрос и использовать ResultSetMapping для заполнения ваших объектов.