2012-05-14 27 views
0

我有一個代碼Yii的更新加入

$command = Yii::app()->db->createCommand() 
     ->update(
      'queue q', 
      array('i.status_id' => $status_id) 
     ) 
     ->join('item i', 'q.item_id = i.item_id') 
     ->where('IN', 'queue_id', $ids); 

我打電話後$命令 - > BuildQuery對於()我得到一個錯誤:

CDbCommand failed to execute the SQL statement: Invalid parameter number: parameter was not defined. The SQL statement executed was: UPDATE queue q SET i . status_id =:i.status_id

的印象是,它並沒有看到加入和命令的地方。 什麼問題?

回答

0

你要綁定的參數:

$command = Yii::app()->db->createCommand() 
    ->update(
     'queue q', 
     array('i.status_id' => ':status_id'), 
     array('in', 'queue_id', $ids), 
     array(':status_id' => $status_id), 
    ) 
    ->join('item i', 'q.item_id = i.item_id'); 
+0

我試過。在這種情況下,它表示參數的數量和它們的條目必須相同。另一個單詞參數僅用於預期的地方。 此外,仔細看,這個參數自動調用「:i.status_id」 –

+0

然後嘗試在綁定參數之前設置where子句。我已經更新了答案。 – Puigcerber

+0

這不受支持,綁定值的數組只能與CDbCriteria而不是CDbCommand一起使用。 – Arth

0

where子句應該是這樣的

Yii::app()->db->createCommand() 
     ->update(
      'queue q', 
      array('i.status_id' => $status_id),array('in', 'queue_id', $ids) 
     ); 

更新()函數和有關JOIN部分有一個開放的bug在https://github.com/yiisoft/yii/issues/124 (林不知道,糾正我,如果我錯了)。請讓我知道是否有解決方法。

+0

沒有區別。由於update方法中的參數是可選的。但我試過了 - 效果相同。 –

+0

但你給了where的參數,where('IN','queue_id',$ ids)',而應該是'where(array','','queue_id',$ ids))' – dInGd0nG

0

在我的項目中遇到過這個問題幾次,我用以下的Yii解決方法使用CDbCriteria,這有點難以理解,但給出了參數計數匹配的安全性。

當適用於您的例子我的代碼是(猜你的結構的一點點):

$ids = array(1,2,3,4,5); 
$criteria = new CDbCriteria(); 
$criteria->addInCondition('i.queue_id',$ids); 

$sql = ' 
    UPDATE queue q 
    JOIN item i 
     ON q.item_id = i.item_id 
    SET i.status_id = :status 
    WHERE '.$criteria->condition; 

$command = Yii::app()->db->createCommand($sql); 
$command->bindValue('status',$status); 
$command->bindValues($criteria->params); 
$rows = $command->execute();