如何通过单个查询更新表中的多个记录? (PostgreSQL)

时间:2019-11-05 17:14:31

标签: php database laravel postgresql eloquent

我有一张桌子,上面有一群动物的名字。

它看起来像这样:

image_1

假设您要更新组的数据。

  • 现在,在group_id = 2的记录中,quantity2变为1
  • group_id = 3的记录中,different_aviariesfalse变为true
  • 在具有group_id = 4的记录中,group_name更改为null,数量更改为0

结果应该是这样的:

image_2

如何在单个请求中完成?

P.S我大大简化了示例中的表格。实际上,可能有必要一次更新40条记录。此外,示例5的表中的列实际上为14。

2 个答案:

答案 0 :(得分:0)

您可以使用Laravel Batch package。从自述文件:

use App\Models\User;

$userInstance = new User;
$value = [
     [
         'id' => 1,
         'status' => 'active',
         'nickname' => 'Mohammad'
     ] ,
     [
         'id' => 5,
         'status' => 'deactive',
         'date' => Carbon::now()
     ] ,
];
$index = 'id';

Batch::update($userInstance, $value, $index);

您可以轻松地对其进行调整以解决您的问题。

答案 1 :(得分:0)

是的,可以在本机SQL中完成。但是,无论是使用ORM还是本机,这都是一个坏主意,尤其是40行14列的情况。如果这是一次操作,则只需编写各个更新。这将是一个更安全的选择,因为随着此错误的增加,发生错误的可能性将大大增加。如果不是一次操作,则没有什么可以提前预测这种可变性。所以每一个都变成一次性的东西。
但这是可以完成的;只是不要:

update animal_groups
   set quantity = case when group_id = 2 then 1
                       when group_id = 4 then 0 
                       else quantity
                  end
     , different_aviaries = case when group_id = 3 then true
                                 else different_aviaries
                            end
     ,  group_name = case when group_id = 4 then null
                          else group_name
                     end                      
 where group_id in (2,3,4);

请注意,数量更新必须同时考虑这两个值的更改,因为列名只能在语句中为一次“左值”。