Можно ли конвертировать в DQL или Doctrine Query Builder

У меня есть 3 таблицы со столбцом

A:
    id
B:
    id
    a_id
C:
    id
    b.id

с собственным запросом:

SELECT a.id, b.id, c.id
FROM A as a 
LEFT JOIN B as b 
    INNER JOIN C as c ON b.id = c.b_id
ON a.id = b.a_id

я пытался

SELECT a.id, b.id, c.id 
    FROM App\HomeBundle\Entity\A as a
    LEFT JOIN App\HomeBundle\Entity\B as b
        INNER JOIN App\HomeBundle\Entity\C as c
        ON c.id = c.bId
    ON a.id = b.aId

я получил ошибку:

Error: Expected Literal, got 'JOIN' 

Можно ли преобразовать мой собственный запрос в DQL или построитель запросов? Если возможно, как это будет выглядеть?


person Somy A    schedule 02.04.2013    source источник
comment
Попробуйте переместить последнее предложение ON на нужное место после предложения LEFT JOIN. Как написано, это не выглядит синтаксически правильным.   -  person BellevueBob    schedule 02.04.2013
comment
да я уже пробую. но я получил другой результат по сравнению с собственным запросом.   -  person Somy A    schedule 02.04.2013
comment
согласно groups.google.com/forum/#!topic/doctrine- user/0rNbXlD0E_8, я думаю, невозможно выполнить этот запрос с помощью Doctrine.   -  person Somy A    schedule 03.04.2013


Ответы (3)


Это всего лишь предположение, но слишком длинное для комментария. Если я полностью ошибаюсь, я удалю этот ответ.

Предполагая, что ваш собственный запрос синтаксически корректен, возможно, MySQL применяет последнее условие ON к результату INNER JOIN между b и c. Если это правда, посмотрите, даст ли это тот же результат:

SELECT a.id, b.id, c.id 
FROM App\HomeBundle\Entity\A as a
LEFT JOIN (
    SELECT bx.aID
    FROM   App\HomeBundle\Entity\B as bx
    INNER JOIN App\HomeBundle\Entity\C as c
    ON    bx.id = c.bId
    ) b
ON a.id = b.aId

Примечание. Я исправил то, что я считаю ошибкой в ​​​​вашей попытке решения (где вы сказали ON c.id = c.bId).

person BellevueBob    schedule 02.04.2013
comment
мне не повезло, я пробую ваши решения. Он работает на собственном SQL, но не повезло с DQL. Я получил сообщение об ошибке: Ошибка: класс '(' не определен. Ровно после LEFT JOIN (. Я думаю, что выражение соединения доктрины не понимает, о каком подзапросе, поэтому оно обрабатывается как класс/сущность. - person Somy A; 02.04.2013
comment
О, извините. Как я уже сказал, это было просто предположение; Я не знаю доктрины. Вы можете удалить тег MySQL и уточнить свой вопрос, чтобы было ясно, что ваша проблема связана только с доктриной. Я все равно оставлю этот ответ; может помочь кому-то еще с реальным решением. - person BellevueBob; 02.04.2013
comment
Тег mysql удален. Спасибо за вашу помощь. я ценю его. :D - person Somy A; 02.04.2013
comment
Я также пытался объединить результаты оператора select, и он не работает в DQL. Я полагаю, это связано с тем, что DQL — это язык запросов entity для взаимодействия с сущностями, которые связаны друг с другом, и не допускает необработанных запросов, использующих временные таблицы и т. д. См. мой связанный вопрос: stackoverflow.com /вопросы/27007090/ - person Chadwick Meyer; 20.11.2014

Это старый вопрос, но я считаю, что вам нужно ПРИСОЕДИНЯТЬСЯ к отношениям, а не к сущности.

Например, вместо

SELECT a
    FROM Entity\A as a
    LEFT JOIN Entity\B as b

Должен быть:

SELECT a
    FROM Entity\A as a
    LEFT JOIN a.entityB as b

Если это неясно, a.entityB является свойством сущности A, называемой "entityB". Это свойство определяет отношения между A и B.

Когда вы просто ПРИСОЕДИНЯЕТЕСЬ к сущности, Doctrine не знает, как они связаны. Однако, если вы ПРИСОЕДИНЯЕТЕСЬ на основе свойства, Doctrine может использовать аннотации (или другое сопоставление) для определения взаимосвязи между A и B.

person UFTimmy    schedule 04.10.2013
comment
Может быть, я неправильно интерпретирую ваш ответ. Но как можно запросить сущность, соединенную со своим свойством? Извините, за поздний ответ. - person Somy A; 07.10.2013

Мне всегда приходилось использовать ключевое слово WITH вместо ON при использовании доктрины.

person Henry    schedule 24.11.2014
comment
Дайте мне более подробное объяснение. - person Somy A; 24.11.2014
comment
Я мало что знаю об этом, кроме того, что DQL, похоже, использует ключевое слово WITH вместо ON. В MySQL я бы использовал ON, в DQL я использую WITH - person Henry; 25.11.2014