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