1

我在 Doctrine 中使用了这个 DQL

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

所以我需要知道为什么这些论点不在正确的地方?

4

1 回答 1

0

几天前,我自己也被完全相同的错误抓住了。我相信这是由 Timestampable 行为中的错误引起的。我猜您在 Product 模型中启用了它,并且 Doctrine 将 updated_at 字段添加到要更新(SET)的一系列字段中,并且没有注意之后您有 SQL 参数的事实(在 where 子句中)。执行 SELECT 时不会出现此错误,因为不涉及 Timestampable。

我发现的唯一解决方案是在构建查询时提供参数,而不是在执行的数组参数中提供参数,并且 Doctrine 不会混淆。像这样:

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

但是,如果您需要使用不同的值多次运行相同的查询,您将失去单独准备和执行阶段的性能优势。看来这是唯一的解决方案。

没有性能损失的可能更好的解决方案:我还没有验证这一点,但是,如果您使用命名参数而不是匿名参数,我希望该错误不会出现?占位符。Doctrine 对命名参数的支持如下所述:http: //www.doctrine-project.org/documentation/manual/1_2/en/dql-doctrine-query-language

编辑:我已经尝试过使用命名参数的替代方法,不幸的是,错误仍然存​​在。Doctrine 给出了一个错误,说你不能在同一个查询中混合命名参数和匿名参数。这真的应该在很久以前就修复了。

于 2011-04-23T04:27:43.177 回答