Несколько дней назад я сам поймал эту же ошибку. Я считаю, что это вызвано ошибкой в поведении 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 выдает ошибку о том, что нельзя смешивать именованные и анонимные параметры в одном запросе. Это действительно должно было быть исправлено давно ИМО.