首页 > 解决方案 > Laravel:有没有办法执行快速批量更新?

问题描述

我最近在 mySQL 中遇到了一种快速批量更新的方法:

缓慢的方式:

UPDATE `example` SET `name` = 'Mary', `age` = '20' WHERE id = 2;
UPDATE `example` SET `name` = 'Nancy', `age` = '30' WHERE id = 4;
UPDATE `example` SET `name` = 'Oliver', `age` = '40' WHERE id = 5;

快速方法:

UPDATE `example` SET 
`name` = ELT(FIELD(id,2,4,5),'Mary','Nancy','Oliver') ,
`age` = ELT(FIELD(id,2,4,5),'20','30','40') 
WHERE id IN (2,4,5);

根据我的谷歌搜索,快速方式在大规模上比慢速方式快 50 倍,所以我想知道 Laravel 是否支持这种类型的批量更新,而无需执行自己生成的原始 sql。

另外,如果有人熟悉mysql并且可以告诉我这是否真的那么快,如果有任何情况,这种方法实际上更糟,我会非常优雅。

编辑(根据评论中的要求):

我当前的 Laravel 代码将像这样进行更新:

foreach ($modelList as $model) {
    $model->setConnection($connection);
    $model->save();
}

我想要批量更新的是

DB::connection($connection)->table($table)->bulkUpdate($models);

据我所知,目前 Laravel 已经支持批量插入,如下所示:

foreach ($models as $model) {
    $attributes = $model->getAttributes();
    $params[] = $attributes;
}

DB::connection($connection)->table($table)->insert($params);

这将生成一个包含多条记录的插入语句,而不是多个插入语句。

标签: mysqllaravelsql-updatebulkupdate

解决方案


如果没有解决方案,您仍然可以使用准备好的语句进行原始操作:

DB::update("
    UPDATE `example` SET 
        `name` = ELT(FIELD(id,2,4,5),?,?,?) ,
        `age` = ELT(FIELD(id,2,4,5),?,?,?) 
    WHERE id IN (?,?,?)
", [
    'Mary', 'Nancy', 'Oliver',
    '20', '30', '40',
    2, 4, 5
]);

从技术上讲,这也应该有效。还没查:

$sql = DB::table('users')->update([
  ['name' => DB::raw("ELT(FIELD(id,2,4,5),'Mary','Nancy','Oliver')")],
  ['age' => DB::raw("ELT(FIELD(id,2,4,5),'20','30','40')")]
])
->whereIn('id', [ 2, 4, 5 ]);

推荐阅读