4

Laravel 4 で Eloquent Model を使用して列の値をインクリメントする方法がわかりませんか? これは私が現在持っているものであり、これがどれほど正しいかはわかりません。

$visitor = Visitor::where('token','=','sometoken')->first();
if(isset($visitor)){
    $visitor->increment('totalvisits');
}else{
    Visitor::create(array(
    'token'=>'sometoken',
    'totalvisits'=>0
    ));
}

Query Builder を使用すると、

DB::table('visitors')->increment('totalvisits');
4

3 に答える 3

24

結局、私が投稿したコードが機能したようです

$visitor = Visitor::where('token','=','sometoken')->first();
if(isset($visitor)){
    $visitor->increment('totalvisits');
}else{
    Visitor::create(array(
    'token'=>'sometoken',
    'totalvisits'=>0
    ));
}
于 2013-05-17T07:37:41.780 に答える
5

数週間前の修正の前に、このincrementメソッドは実際にはクエリ ビルダーに失敗し、テーブル全体で呼び出されていましたが、これは望ましくありませんでした。

incrementモデル インスタンスに対してorを呼び出すとdecrement、そのモデル インスタンスに対してのみ操作が実行されます。

于 2013-05-17T02:12:22.627 に答える
2

Laravel 5 にはアトミックインクリメントが追加されました:

public function increment($column, $amount = 1, array $extra = [])
{
    if (! is_numeric($amount)) {
        throw new InvalidArgumentException('Non-numeric value passed to increment method.');
    }
    $wrapped = $this->grammar->wrap($column);
    $columns = array_merge([$column => $this->raw("$wrapped + $amount")], $extra);
    return $this->update($columns);
}

基本的に次のように機能します。

Customer::query()
->where('id', $customer_id)
->update([
'loyalty_points' => DB::raw('loyalty_points + 1')
]);

以下はLaravel 4の古い回答で、組み込みのインクリメントは個別の選択であり、更新すると、もちろん複数のユーザーでバグが発生します。

更新がアトミックであることを確認して訪問者を正確にカウントしたい場合は、これを Visitor モデルに入れてみてください。

public function incrementTotalVisits(){
    // increment regardless of the current value in this model.
    $this->where('id', $this->id)->update(['totalVisits' => DB::raw('last_insert_id(totalVisits + 1)')]);

    //update this model incase we would like to use it.
    $this->totalVisits = DB::getPdo()->lastInsertId();

    //remove from dirty list to prevent any saves overwriting the newer database value.
    $this->syncOriginalAttribute('totalVisits');

    //return it because why not
    return $this->totalVisits;
}

私は変更タグシステムに使用していますが、あなたのニーズにも合うかもしれません。

"$this->where('id',$this->id)" を何に置き換えるかを知っている人はいますか? $this Visitor を扱うので冗長になるはずです。

于 2014-10-25T11:49:39.447 に答える