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

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

4

4 回答 4

1

您的代码在最新的 Yii 版本中有效。自 1.1.14 起已添加此 MySQL 特定功能:https ://github.com/yiisoft/yii/commit/ed49b77ca059c0895be17df5813ee1e83d4c916d 。

于 2013-10-21T11:21:41.450 回答
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');
于 2012-05-14T08:51:40.103 回答
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有一个开放的错误(我不确定。如果我错了,请纠正我)。请让我知道是否有解决方法。

于 2012-05-14T09:15:36.520 回答
0

在我的项目中遇到过几次这个问题后,我想出了以下使用 CDbCriteria 的 Yii 解决方法,这有点 hacky,但提供了参数计数匹配的安全性。

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

$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();
于 2014-03-28T11:35:03.083 回答