Doctrine DQL执行传递params

时间:2010-04-28 09:00:10

标签: php doctrine-query

我在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); 

所以我需要知道为什么参数不在正确的位置?

1 个答案:

答案 0 :(得分:0)

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

我找到的唯一解决方案是在构建查询时提供参数,而不是在execute的数组参数中提供参数,并且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提供了一个错误,指出您不能在同一查询中混合使用命名和匿名参数。这真的应该在很久以前修好了IMO。