如何使用 CActiveRecord 方法在不实例化模型的情况下将数据库字段更新为自身的函数



>假设我有一个模型Product来自一个包含idin_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)
}

您能详细说明为什么不想创建模型的实例吗?

最新更新