Я пытаюсь построить запрос с построителем запросов 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');
Соединение DQL работает только в том случае, если в вашем сопоставлении определена ассоциация. В вашем случае я бы сказал, что гораздо проще сделать собственный запрос и использовать ResultSetMapping для заполнения ваших объектов.