Symfony 2: внутреннее соединение в не связанной таблице с doctrine query builder
Я пытаюсь построить запрос с помощью doctrine query builder, который присоединяется к не связанной таблице, как это:
$query = $this->createQueryBuilder('gpr')
->select('gpr, p')
->innerJoin('TPost', 'p')
->where('gpr.contentId = p.contentId')
но это не сработает. Я все еще получаю сообщение об ошибке:
ошибка: идентификационная переменная TPost используется в выражении пути соединения, но не была определена ранее.
Я искал это сообщение об ошибке, и все ответили, чтобы использовать псевдоним таблицы + атрибут, как p.что-то вроде. Но таблица, к которой я хочу присоединиться, не связана с таблица я начинаю свой выбор.
как обычный запрос mysql я бы написал это так:
SELECT * FROM t_group_publication_rel gpr
INNER JOIN t_post p
WHERE gpr.content_id = p.content_id
любые идеи, что я делаю неправильно?
4 ответов
сегодня я работал над подобной задачей и вспомнил, что открыл эту проблему. Я не знаю, с какой версии доктрины он работает, но прямо сейчас вы можете легко присоединиться к дочерним классам в наследовании. Таким образом, такой запрос работает без каких-либо проблем:
$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.4, где вы можете создать произвольное соединение со следующим синтаксисом:
$query = $em->createQuery('SELECT u FROM User u JOIN Blacklist b WITH u.email = b.email');
$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();
соединение DQL работает только в том случае, если в вашем сопоставлении определена ассоциация. В вашем случае я бы сказал, что гораздо проще сделать собственный запрос и использовать ResultSetMapping для заполнения объектов.