我不确定如何在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');
答案 0 :(得分:22)
看起来我发布的代码完全适用于
$visitor = Visitor::where('token','=','sometoken')->first();
if(isset($visitor)){
$visitor->increment('totalvisits');
}else{
Visitor::create(array(
'token'=>'sometoken',
'totalvisits'=>0
));
}
答案 1 :(得分:5)
在fix a few weeks ago之前,increment
方法实际上已落入查询构建器并将在整个表上调用,这是不可取的。
现在,在模型实例上调用increment
或decrement
将仅对该模型实例执行操作。
答案 2 :(得分: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的旧答案,其中内置增量是单独选择然后更新当然导致多个用户的错误:
如果您希望通过确保更新是原子性来准确计算访问者数量,那么请尝试将其放入访问者模型中:
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访客它应该是多余的。