Справка по запросу Doctrine

#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. По крайней мере, в этом контексте имена моделей и таблиц являются единственными по соглашению.