一次性更新多行数据的Laravel Eloquent方法

9

我有一个表格products,其结构如下:

id | name | promote

其中列promote是布尔类型。

我想选择某些行并将boolean列的值设置为1,未选择的行则设置为0。我在控制器中编写了以下代码来处理此查询。

$yes = Tour::whereIn('id', $request->promote)->get();
$no = Tour::whereNotIn('id', $request->promote)->get();

foreach ($yes as $item) {
    $item->promote = 1;
    $item->save();
}

foreach ($no as $item) {
    $item->promote = 0;
    $item->save();
}

我从表单请求中得到以下内容。

在此输入图片描述

上述代码确实有效,但我认为它不够高效。我正在寻找其他可选的方法以更有效地实现结果。

2个回答

9

不必检索结果并循环操作,你可以直接进行更新。

$yes =  Tour::whereIn('id', $request->promote)->update(['promote' => 1]);
$no =  Tour::whereNotIn('id', $request->promote)->update(['promote' => 0]);

4

如果您不介意通过模型进行更新,可以在构建器上调用update来更新所有匹配的记录。由于这将使用构建器而不是模型,因此不会触发任何模型事件:

// set them all to promote = 0
Tour::update(['promote' => 0]);
// or  just set the ones that need to be 0
Tour::whereNotIn('id', $request->promote)->update(['promote' => 0]);

// set the ones you want to promote = 1
Tour::whereIn('id', $request->promote)->update(['promote' => 1]);

只有一种方法来尝试它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接