#zend-framework #doctrine
#zend-framework #doctrine
Вопрос:
Мне нужно выполнить sql-запрос с использованием doctrine. запрос действительно прост
ВЫБЕРИТЕ q.*, ПОСЧИТАЙТЕ (a.question_id) ИЗ question КАК q СЛЕВА, ПРИСОЕДИНИТЕ question_answers КАК a К ГРУППЕ q.id=a.question_id ПО a.question_id
Для этой цели я написал следующий код
$query = Doctrine_Query::create()
->select('q.*, COUNT(a.question_id) AS answers')
->from('Model_Question q')
->leftJoin('Model_QuestionAnswers a ON q.id = a.question_id')
->groupBy('a.question_id');
Но это не дает мне желаемого запроса. Кто-нибудь может объяснить мне, чего мне не хватает? Запрос, который генерируется, я проверил через $query->buildSqlQuery()
, является
SELECT q.id AS q__id, q.title AS q__title, q.short_description AS q__short_description,
q.created_at AS q__created_at, q.updated_at AS q__updated_at, q.is_visible AS
q__is_visible, q.category_id AS q__category_id, q.user_id AS q__user_id, q.category_name
AS q__category_name, q.username AS q__username, COUNT(q2.question_id) AS q2__0 FROM
question q, question_answers q2 GROUP BY q2.question_id
Комментарии:
1. что произойдет, если вы удалите
ON
условие из объединения (судя по вашей модели, это должно быть условие по умолчанию, поэтому нет причин указывать его — оно будет объединено в этих столбцах автоматически)?
Ответ №1:
Поскольку вы не использовали стандартное соглашение об именовании между таблицами и именами моделей, Doctrine запуталась в объединении. Я подозреваю, что вы также, возможно, не определили взаимосвязь между моделями / таблицами, чтобы Doctrine могла автоматически создавать соединения для вас.
Попробуйте изменить ваш вызов leftJoin () в этом запросе, чтобы он выглядел следующим образом:
->leftJoin('q.Model_QuestionAnswers a')
Возможно, вам потребуется явно определить отношение в вашем файле schema.yml, чтобы сработала простая инструкция, подобная приведенной выше. Например, в конце определения для Model_QuestionAnswers вы бы добавили:
relations:
Model_Question:
local: question_id
foreign: id
foreignAlias: Model_QuestionAnswers
Также примечание: я заметил, что вы используете имена как в единственном, так и во множественном числе для своих таблиц и моделей. Обычно выбирают тот или иной вариант и придерживаются его, особенно когда вы используете фреймворки и / или ORM, которые должны иметь возможность угадывать имена и автоматически генерировать код. Я использую Doctrine с фреймворком Symfony. По крайней мере, в этом контексте имена моделей и таблиц являются единственными по соглашению.