我有一个代码
$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
SETi
。status_id
=:i.status_id
印象是它没有看到连接和where命令。 有什么问题?
答案 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();