【问题标题】:Update multiple rows at once Laravel Eloquent一次更新多行 Laravel Eloquent
【发布时间】:2020-04-19 08:15:36
【问题描述】:

我的表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();
}

我从表单请求中得到关注。

上面的代码确实有效,但我认为它不是很有效。我正在寻找以更有效的方式实现结果的可选方法。

【问题讨论】:

    标签: laravel eloquent laravel-6


    【解决方案1】:

    如果您不关心通过模型进行更新,您可以在构建器上调用 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]);
    

    只是尝试的一种方法。

    【讨论】:

      【解决方案2】:

      取而代之的是检索结果,循环遍历,可以直接更新,

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

      【讨论】:

        猜你喜欢
        • 2015-08-31
        • 2020-12-20
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 2017-02-23
        相关资源
        最近更新 更多