2013-05-16 3 views
3

Я не уверен, как увеличить значение в столбце с использованием Eloquent Model в Laravel 4? Это то, что у меня есть сейчас, и я не уверен, насколько это правильно.Как увеличить столбец с использованием Eloquent Model в Laravel 4

$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'); 
+0

Ваш код отлично работает на моем конце, есть ли что-нибудь еще, чем то, что вы разместили? – ARW

+0

Должен ли я вызвать метод сохранения после вызова метода increment? –

+3

Вам не нужно использовать метод «increment», поскольку он действительно предназначен для использования в запросе, в котором вы не сохранили бы потом. В качестве альтернативы вы можете пойти $ visitor-> totalvisits = $ visitor-> totalvisites + 1; $ Visitor-> Save(); – ARW

ответ

21

Похоже код, который я вывесил работал после того, как все

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

До принятия fix a few weeks ago метод increment фактически провалилось к построитель запросов и будет называться по всей таблице, которая была нежелательна ,

Теперь вызов increment или decrement экземпляра модели будет выполнять операцию только для экземпляра модели.

+0

Спасибо Джейсону, я не был уверен, как использовать метод incrememt с Eloquent Модель и мой код, упомянутые в коде, работают хорошо. Ценю вашу помощь. –

1

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, он должен быть избыточным.

+0

Я оставил ответ на ваш другой комментарий, но похоже, что версия Laravel, используемая мной (5.3), реализует метод атома 'increment'. Ознакомьтесь с [Документацией по построителю запроса] (https://github.com/illuminate/database/blob/master/Query/Builder.php), функция «increment» находится в строке 2177. –

+0

см. Https: // laravel .com/docs/5.6/queries # increment-and-декремент – mike

+0

@MattK хорошее место Я обновил свой ответ – malhal

Смежные вопросы