2

假设我有一个带有和字段Product的表中的模型。我只需要将值更新为. 有没有办法在不创建模型实例的情况下使用 Yii 函数更新它?我试过idin_stockin_stock(in_stock + added_stock)

Product::model()->updateByPk($id,array('in_stock'=>'in_stock+'.$added_stock));

但它没有用。欢迎任何解决方案。

4

3 回答 3

3

正如其他人所提到的,我不确定为什么你不能在这里创建一个模型实例并这样做,但是当你问这个问题时,我猜你有一个理由!

在这种情况下,如果您不能创建模型并且想要静态地执行它,您可以使用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

于 2012-12-19T10:24:32.790 回答
2

我猜你打算这$added_stock是一个本地 PHP 变量?如果是这样,这可能是最好的方法:

Product::model()->updateCounters(
    array('in_stock' => $added_stock), 
    array('condition'=>'id = :id'),
    array(':id' => $id)

);

这应该可以在不查询记录的情况下向字段添加任意数量。它还会事先将$added_stock变量转换为整数,因此无需担心 SQL 注入或需要将其放入参数中。

PS 也适用于小数。尽管我不认为我想知道为什么您必须处理小部分库存?:)

于 2012-12-19T01:02:14.487 回答
0

虽然我不太确定您为什么要避免创建模型实例,但您可以这样做:

$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)
}

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

于 2012-12-19T05:43:31.003 回答