Yii更新加入

时间:2012-05-14 08:09:26

标签: 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);

在我调用$ command-> buildQuery()之后,我收到一个错误:

  

CDbCommand无法执行SQL语句:参数号无效:未定义参数。执行的SQL语句是:UPDATE queue q SET istatus_id =:i.status_id

印象是它没有看到连接和where命令。 有什么问题?

4 个答案:

答案 0 :(得分:1)

您的代码适用于最新的Yii版本。自1.1.14起添加了此特定于MySQL的功能:https://github.com/yiisoft/yii/commit/ed49b77ca059c0895be17df5813ee1e83d4c916d

答案 1 :(得分: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');

答案 2 :(得分:0)

where子句应该在update()函数中,如此

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

关于JOIN部分,https://github.com/yiisoft/yii/issues/124有一个开放的错误(我不确定。如果我错了,请纠正我)。如果有解决方法,请告诉我。

答案 3 :(得分:0)

在我的项目中遇到过这个问题几次我已经提出了以下Yii使用CDbCriteria来解决这个问题,这个问题很简单,但它提供了param计数匹配的安全性。

当应用于您的示例时,我的代码将是(猜测您的结构):

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