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 に答える