首页 文章

Yii更新加入

提问于
浏览
0

我有一个代码

$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 i.status_id =:i.status_id

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

4 回答

  • 0

    您的代码对最新的Yii版本有效 . 从1.1.14开始,这个特定于MySQL的功能已添加:https://github.com/yiisoft/yii/commit/ed49b77ca059c0895be17df5813ee1e83d4c916d .

  • 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有一个开放的错误(我不确定 . 如果我错了,请纠正我) . 如果有解决方法,请告诉我 .

  • 1

    你必须绑定参数:

    $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

    在我的项目中遇到过这个问题几次我已经提出了以下Yii使用CDbCriteria来解决这个问题,这是一个有点hacky,但它提供了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();
    

相关问题