0

私はlaravel v3.2.12-4を使用していますが、減分機能に問題があります。1 行だけを更新する代わりに、このメソッドは列内のすべての行に影響を与えます。私はEloquentを使用しており、多対多の関係があります。

decrement メソッドを含むコードは次のとおりです。

 foreach ($ids as $id) {
 $indicator = Indicator::find($id);
 $tags = $indicator->tags()->get();
 foreach ($tags as $tag) {

    $indicator->tags()->detach($tag->id);
    if ($tag->frequency == 1) {
        $tag->delete();
    } else {
        // I have to made  this code to fix the problem with decrement function
        // But i want to use decrement
        $tag->frequency = $tag->frequency - 1;
        $tag->save();

        // This dosnt work for me.
        // $tag->decrement('frequency');
    }
}

$indicator->delete();

}

モデル クラス Indicator で、この関数との関係を作成しました。

public function tags()
{
    return $this->has_many_and_belongs_to('Tag');
}

モデル クラス Tag で、この関数との関係を作成しました。

public function indicators()
{
    return $this->has_many_and_belongs_to('Indicator');
}

まあ、列を更新した場合、この結果は問題ありませんが、デクリメント関数を使用すると、これはすべての行に影響し、これがバグなのか、このメソッドの何かなのかわかりません。

ありがとう。

4

1 に答える 1

0

このように設計されています。このメソッドは、Eloquents ビルダーではなく、クエリ ビルダーdecrement()で実際に定義されます。これが意味することは、呼び出すと、実際には QB にフォールスルーし、単純に のようなクエリを実行するということです。WHERE 句がないことに注意してください。$tag->decrement('frequency')UPDATE tag SET frequency=frequency - 1

この方法は引き続き使用できますが、decrement()このようにする必要があります。

$tag->where_id($tag->id)->decrement('frequency');

WHERE 句を設定すると、そのタグだけがデクリメントされます。もちろん、よりクリーンなソリューションはあなたが持っているものです。またはおそらくこれ。

$tag->frequency--;

テストされていないため、何らかのエラーが発生する可能性があります。

于 2013-04-11T12:50:39.763 に答える