假设我有一个带有和字段Product
的表中的模型。我只需要将值更新为. 有没有办法在不创建模型实例的情况下使用 Yii 函数更新它?我试过id
in_stock
in_stock
(in_stock + added_stock)
Product::model()->updateByPk($id,array('in_stock'=>'in_stock+'.$added_stock));
但它没有用。欢迎任何解决方案。
假设我有一个带有和字段Product
的表中的模型。我只需要将值更新为. 有没有办法在不创建模型实例的情况下使用 Yii 函数更新它?我试过id
in_stock
in_stock
(in_stock + added_stock)
Product::model()->updateByPk($id,array('in_stock'=>'in_stock+'.$added_stock));
但它没有用。欢迎任何解决方案。
正如其他人所提到的,我不确定为什么你不能在这里创建一个模型实例并这样做,但是当你问这个问题时,我猜你有一个理由!
在这种情况下,如果您不能创建模型并且想要静态地执行它,您可以使用CDbExpression创建表达式,这样整个表达式就不会被查询构建器转义(这就是会发生的情况在你的例子中)。
像这样的东西会起作用;
$added_stock = 1;
$newStock = new CDbExpression('(`in_stock`+:addedStock)',array(
':addedStock' => $added_stock)
);
Product::model()->updateByPk($id,array(
'in_stock' => $newStock
));
上面的代码将增加in_stock
任何值$added_stock
。
我猜你打算这$added_stock
是一个本地 PHP 变量?如果是这样,这可能是最好的方法:
Product::model()->updateCounters(
array('in_stock' => $added_stock),
array('condition'=>'id = :id'),
array(':id' => $id)
);
这应该可以在不查询记录的情况下向字段添加任意数量。它还会事先将$added_stock
变量转换为整数,因此无需担心 SQL 注入或需要将其放入参数中。
PS 也适用于小数。尽管我不认为我想知道为什么您必须处理小部分库存?:)
虽然我不太确定您为什么要避免创建模型实例,但您可以这样做:
$sql = "SELECT in_stock FROM Product t WHERE id=:id";
$params = array(':id'=>$id);
$in_stock = Yii::app()->db->createCommand($sql)->queryScalar($params);
Product::model()->updateByPk($id, array(
'is_stock'=>$added_stock+$in_stock,
);
当然,那样做的工作似乎要多得多。您始终可以将其包装在 Product 模型中您自己的静态方法中并以这种方式调用它。
public static function addStock($id,$added_stock){
(place code from above here)
}
你能详细说明为什么你不想创建模型的实例吗?