2010-04-28 64 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); 

所以我需要知道爲什麼參數麥凱納在正確的地方?

回答

0

幾天前我被自己的同一個錯誤發現。我相信這是由Timestampable行爲中的錯誤引起的。我猜你已經在產品模型中啓用了它,並且Doctrine將updated_at字段添加到一系列字段中以更新(SET),並且沒有注意到之後你有SQL參數的事實(在where子句中)。由於不涉及Timestampable,因此在執行SELECT時不會出現此錯誤。

我發現的唯一解決方案是在構建查詢時提供參數,而不是在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

編輯:我已經嘗試了命名參數的替代方法,不幸的是錯誤依然存在。學說給出了一個錯誤,說你不能在同一個查詢中混合命名和匿名參數。 IMO確實應該很久以前解決這個問題。