>假设我有一个模型Product
来自一个包含id
和in_stock
字段的表。我只需要将in_stock
值更新为 (in_stock + added_stock)
.有没有办法使用 Yii 函数更新它而不创建模型的实例?我试过了
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
));
上面的代码将按 $added_stock
的值递增in_stock
。
我猜你的意思是$added_stock
是一个本地PHP变量?如果是这样,这可能是最好的方法:
Product::model()->updateCounters(
array('in_stock' => $added_stock),
array('condition'=>'id = :id'),
array(':id' => $id)
);
这应该可以在不查询记录的情况下向字段添加任意金额。它还会事先将$added_stock
变量转换为整数,因此不必担心SQL注入或需要将其放在参数中。
P.S也适用于小数。虽然我想我不想知道为什么你必须处理库存单位的一小部分??:)
虽然我不太确定为什么要避免创建模型的实例,但您可以这样做:
$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,
);
当然,这样似乎还有很多工作要做。您始终可以将其包装在产品模型中自己的静态方法中,并以这种方式调用它。
public static function addStock($id,$added_stock){
(place code from above here)
}
您能详细说明为什么不想创建模型的实例吗?