Доктрина DQL выполняет прохождение параметров - PullRequest
1 голос
/ 28 апреля 2010

Я использовал этот DQL в Doctrine

$q->update('product')
->set('quantity','?')
->where('id=?');
$q->execute(array(20,5));

Я проверяю сервер на запрос и это сгенерированный sql

    UPDATE product SET quantity = '20', updated_at = '5' 
WHERE (id = '2010-04-26 14:34); 

Так что мне нужно знать, почему аргументы не в правильных местах?

1 Ответ

0 голосов
/ 23 апреля 2011

Несколько дней назад я сам поймал эту же ошибку. Я считаю, что это вызвано ошибкой в ​​поведении Timestampable. Я предполагаю, что он включен в модели Product, а Doctrine добавляет поле updated_at в серию полей для обновления (SET) и не обращает внимания на тот факт, что после этого у вас есть параметры SQL (в предложении where). ). Эта ошибка никогда не появляется при выполнении SELECT, потому что Timestampable не задействовано.

Единственное решение, которое я нашел, это предоставить параметры при построении запроса, а не в параметре массива execute, и Doctrine не запутается. Как это:

$q->update('product')
 ->set('quantity', 20)
 ->where('id = ?', 5);
$q->execute();

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

Потенциально лучшее решение без потери производительности: Я не проверял это, однако, я надеюсь, что ошибка не появится, если вы используете именованные параметры вместо анонимных? заполнители. Поддержка Doctrine для именованных параметров описана здесь: http://www.doctrine -project.org / documents / manual / 1_2 / en / dql-doctrine-query-language

РЕДАКТИРОВАТЬ: С тех пор я попробовал альтернативный подход с именованными параметрами, и, к сожалению, ошибка остается. Doctrine выдает ошибку о том, что нельзя смешивать именованные и анонимные параметры в одном запросе. Это действительно должно было быть исправлено давно ИМО.

...