У меня такой код:
$params = array();
$query_questions_visibles = questionTable::getInstance()->createQuery("q")
->select("q.*, ua.*, a.*, u.*, c.*")
->leftJoin("q.Answers a")
->leftJoin("a.UserAnswers ua")
->Where("q.blocked = false")
->andWhere("ua.user_id = :user_id")
->orderBy("q.id DESC")
->groupBy("q.id");
//Subquery --> Calculates when a question is active or not
$format = sfConfig::get("app_datetime_format");
$active_time = date($format, strtotime(sfConfig::get("app_question_active_time")));
$sub_query_is_active = $query_questions_visibles->createSubQuery()
->select("MAX(ua0.created_at)")
->from("question q0")
->leftJoin("q0.Answers a0")
->leftJoin("a0.UserAnswers ua0")
->where("q0.id = q.id");
$query_questions_visibles->addSelect("COALESCE((".$sub_query_is_active.") > :active_time, false) as Active");
//Set param values
$params["user_id"] = $guardUser->id;
$params["active_time"] = $active_time;
$result = $query_questions_visibles->execute($params);
Предыдущий код работает должным образом.
Сгенерированный SQL завершен и работает:
ВЫБРАТЬ q.id AS q__id, q.user_id AS q__user_id, q.category_id AS q__category_id, q.gender_restriction AS q__gender_restriction, q.question AS q_ question, q.photo AS q _photo, q.latitude AS q_ latitude, q.longitude AS q _longitude, q.multiple AS q_ multiple, q.blocked AS q _blocked, q.created_at AS q__created_at, q.updated_at AS q__updated_at, a.id AS a__id, a.question_id AS a__question_id, a.text AS a_ text, u.id AS u _id, u.user_id AS u__user_id, u.answer_id AS u__answer_id, u.created_at AS u__created_at , u.updated_at AS u__updated_at, COALESCE ((SELECT MAX (u2.created_at) AS u2__0 FROM question q2 LEFT JOIN answer a2 ON q2.id = a2.question_id LEFT JOIN user_answer u2 ON a2.id = u2.answer_id WHERE (q2. id = q.id))>: active_time, 0) AS u2__0 FROM вопрос q LEFT JOIN ответ a ON q.id = a.question_id LEFT JOIN user_answer u ON a.id = u.answer_id WHERE (q.blocked = 0 AND u.user_id =: user_id) ГРУППА ПО q.id ЗАКАЗАТЬ ПО q.id DESC
Но если я хочу ограничить результаты, я изменяю конечные строки следующим образом:
$query_questions_visibles->limit(10);
$result = $query_questions_visibles->execute($params);
Доктрина выдает ошибку:
SQLSTATE [HY093]: недопустимый номер параметра: количество связанных переменных не соответствует количеству токенов.
at Doctrine_Connection-> execute ('SELECT DISTINCT q2.id FROM question q2 LEFT JOIN answer a2 ON q2.id = a2.question_id LEFT JOIN user_answer u2 ON a2.id = u2.answer_id WHERE q2.blocked = 0 AND u2.user_id = : user_id ГРУППА ПО q2.id ORDER BY q2.id DESC LIMIT 10 ', array (' user_id '=>' 1 ',' active_time '=>' 2013-03-17 17:12:12 ')) в SF_ROOT_DIR \ lib \ vendor \ symfony \ lib \ plugins \ sfDoctrinePlugin \ lib \ vendor \ doctrine \ Doctrine \ Query.php строка 1290 ...
Моя цель - ограничить запрос только 10 результатами, где мой подзапрос с функциями COALESCE и MAX? ¿Почему есть SELECT DISTINCT, которого я не указал? ¿Почему выбирается только q.id?
Я весь день пытаюсь понять это, у меня нет ответа ... Есть идеи, почему установка лимита вызывает это?