Laravel 5 теперь имеет атомный increment:
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, где встроенный прирост был отдельным выбором, а затем обновил wh ич, конечно, приводит к ошибкам с несколькими пользователями:
Если вы хотите, чтобы точно подсчитать посетитель, обеспечивая обновление является атомарной затем попытайтесь поместить это в модели 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-» где ('id', $ this-> id), потому что, поскольку он имеет дело с $ this Visitor, он должен быть избыточным.
Ваш код отлично работает на моем конце, есть ли что-нибудь еще, чем то, что вы разместили? – ARW
Должен ли я вызвать метод сохранения после вызова метода increment? –
Вам не нужно использовать метод «increment», поскольку он действительно предназначен для использования в запросе, в котором вы не сохранили бы потом. В качестве альтернативы вы можете пойти $ visitor-> totalvisits = $ visitor-> totalvisites + 1; $ Visitor-> Save(); – ARW