如何在一个雄辩的查询中增加和更新列

时间:2016-06-06 20:16:52

标签: php eloquent laravel-5.2

是否可以更新时间戳(updated_at除外)并在一个查询中增加一列?我显然可以->increment('count')和单独->update(['last_count_increased_at' => Carbon::now()]),但有一种简单的方法可以同时进行。

Product::where('product_id', $product->id) ->update(['count'=>count+1, 'last_count_increased_at' => Carbon::now()];

无需先查询并获取计数?

3 个答案:

答案 0 :(得分:15)

您可以使用DB::raw方法:

Product::where('product_id', $product->id)
    ->update([
      'count'=> DB::raw('count+1'), 
      'last_count_increased_at' => Carbon::now()
    ]);

答案 1 :(得分:3)

您可以指定在操作期间要更新的其他列:

Product::where('product_id', $product->id)
->increment('count', 1, ['last_count_increased_at' => Carbon::now()]);

答案 2 :(得分:0)

使用 Laravel 8,您现在可以在单个查询中实现这一点,以创建或更新重复键。

$values = [
    'name' => 'Something',
    'count' => 1,
];
$uniqueBy = ['name'];
$update = ['count' => DB::raw('count+1')];

Model::upsert($values, $uniqueBy, $update);

如果模型存在,count 将递增,如果插入,count 将等于 1。这是在 DB 级别完成的,因此只涉及一个查询。

阅读有关 upsert 的更多信息:https://laravel.com/docs/8.x/eloquent#upserts