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
Любые идеи, что я делаю неправильно?
Ответы
Ответ 1
Сегодня я работал над подобной задачей и помнил, что открыл эту проблему. Я не знаю, с какой версии доктрины он работает, но прямо сейчас вы можете легко присоединиться к дочерним классам в наследовании. Таким образом, такой запрос работает без проблем:
$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);
Я запускаю запрос в своем родительском классе, который использует сопоставление наследования. В моем предыдущем посте это была другая отправная точка, но та же проблема, если я правильно помню.
Поскольку это была большая проблема, когда я начал эту проблему, я думаю, что это может быть интересно и для других людей, которые не знают об этом.
Ответ 2
Соединения между объектами без ассоциаций не были возможны до версии 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
Ответ 3
$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();
Ответ 4
Соединение DQL работает только в том случае, если в вашем сопоставлении определена ассоциация. В вашем случае я бы сказал, что гораздо проще сделать собственный запрос и использовать ResultSetMapping для заполнения ваших объектов.