2010-04-28 2 views
1

Я использовал этот DQL в УченииДоктрина DQL выполнить прохождение PARAMS

$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); 

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

ответ

0

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

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

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

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

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

EDIT: С тех пор я попробовал альтернативный подход с именованными параметрами и, к сожалению, ошибка осталась. Doctrine дает ошибку, говоря, что вы не можете смешивать именованные и анонимные параметры в том же запросе. Это действительно должно было быть исправлено давным-давно ИМО.

Смежные вопросы