2015-11-18 23 views
1

當我使用bindParam在Yii2:Yii2綁定參數去了現場的原始SQL語句

$arr = [1,3]; 
$str = implode(' ,', $arr); 
Yii::$app->db->createCommand('DELETE FROM article_tag WHERE article_id=:id AND tag_id IN (:str)') 
     ->bindValue(':id', $this->id) 
     ->bindValue(':str', $str) 
     ->execute(); 

,如果我綁定海峽到現場,原始SQL似乎變得

SQLSTATE[22007]: Invalid datetime format: 1292 Truncated incorrect DOUBLE value: '1 ,3' 
The SQL being executed was: DELETE FROM article_tag WHERE article_id=13 AND tag_id IN ('1 ,3') 

它在這裏告訴我不正確的double值。我想這是因爲它向sql添加了單引號。我怎麼能處理這個?

回答

2

的代碼可以重構爲:

Yii::$app 
    ->db 
    ->createCommand() 
    ->delete('article_tag', ['article_id' => $this->id, 'tag_id' => $arr]) 
    ->execute(); 

使用框架功能,寫是需要更復雜的查詢原始的SQL。

請參閱this question瞭解params是如何自動綁定的。 Here你可以看到如何指定條件到where語句。

對於大多數情況下,最好創建ActiveRecord並使用ActiveQuery進行構建查詢。

+0

它會在這裏刪除多條記錄嗎?我使用IN,因爲我想使用一個sql刪除多個記錄。 – tyan

+0

@tyan是的,當您將數組作爲值傳遞給'where語句中的鍵值對時,它會自動轉換爲'IN'語句。請參閱[提供的鏈接](http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where%28%29-detail),數組和「IN」就是一個例子。 – arogachev