2012-06-20 3 views
17

Я пытаюсь построить запрос с застройщиком доктриного запроса, который присоединяется к несвязанной таблице, как это:Symfony 2: INNER JOIN на не связанную таблицу с застройщиком доктриным запроса

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

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

Error: Identification Variable TPost used in join path expression but was not defined before.

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

Как нормальный MySQL Query я бы написать это следующим образом:

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

Любые идеи, что я делаю не так?

+0

Мы можем использовать DQL для выполнения соединение с несвязанными объектами? Я не знаю. Если возможно, это интересно =). – sensorario

+2

Почему бы вам просто не построить * связь между этими двумя, если вы хотите присоединиться к ним? –

+0

В этом случае отношения было бы недостаточно. Мне нужны отношения к 3 различным таблицам, и любая запись может установить только ссылку на 1 из них. 3. –

ответ

51

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

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

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

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

+0

Спасибо! Это действительно помогло, я искал часы. – Assil

+0

Если у меня нет репозитория 'MyBundleName: ChildTwo', я хочу написать запрос с именем таблицы, то в чем же решение.? –

+0

@MohammadFareed Ссылка на объект не является репозиторием, это либо строка в форме «: », либо FQCN класса сущности, например. \ AppBundle \ Entity \ ChildTwo :: class –

0

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

2
$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(); 
+1

Хотя этот ответ не содержит требуемых подробностей, нет ничего, чтобы ссылаться, поскольку документация Doctrine полностью лишена охвата этих типов объединений. Это сработало для меня. Я знаю достаточно sql для анализа того, что было предназначено, и недостаточно доктрины для подключения точек. – eggmatters

3

присоединяется между сущностями без ассоциаций не были возможны до версии 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

+0

Это потрясающе!Обратите внимание, что в этом случае требуется предложение WITH WITH, в противном случае это приведет к синтаксической ошибке. Однако вы можете просто использовать фиктивное условие и по существу получить реальное кросс-соединение, которое DQL в противном случае не поддерживает. Например: 'SELECT u FROM User u JOIN Элементы i WITH 0 = 0'. Это может быть полезно для сложных статистических данных. – jlh

 Смежные вопросы

  • Нет связанных вопросов^_^