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');

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


$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 для заполнения объектов.