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 を扱うので冗長になるはずです。