laravel实现批量更新多条记录的⽅法⽰例
前⾔
相信熟悉laravel的童鞋都知道,laravel有批量⼀次性插⼊多条记录,却没有⼀次性按条件更新多条记录。
是否羡慕thinkphp的saveAll,是否羡慕ci的update_batch,但如此优雅的laravel怎么就没有类似的批量更新的⽅法呢?⾼⼿在民间
本篇⽂章,结合laravel的Eloquent做了调整,可有效防⽌sql注⼊。
⽰例代码
<?php
namespace App\Models;
use DB;
use Illuminate\Database\Eloquent\Model;
/**
* 学⽣表模型
*/
class Students extends Model
{
protected $table = 'students';
//批量更新
public function updateBatch($multipleData = [])
{
try {
if (empty($multipleData)) {
throw new \Exception("数据不能为空");
}
$tableName = DB::getTablePrefix() . $this->getTable(); // 表名
$firstRow = current($multipleData);
$updateColumn = array_keys($firstRow);
// 默认以id为条件更新,如果没有ID则以第⼀个字段为条件
$referenceColumn = isset($firstRow['id']) ? 'id' : current($updateColumn);
unset($updateColumn[0]);
// 拼接sql语句
$updateSql = "UPDATE " . $tableName . " SET ";
$sets  = [];
$bindings = [];
foreach ($updateColumn as $uColumn) {
$setSql = "`" . $uColumn . "` = CASE ";
foreach ($multipleData as $data) {
$setSql .= "WHEN `" . $referenceColumn . "` = ? THEN ? ";
$bindings[] = $data[$referenceColumn];
$bindings[] = $data[$uColumn];
}
$setSql .= "ELSE `" . $uColumn . "` END ";
$sets[] = $setSql;
}
$updateSql .= implode(', ', $sets);
$whereIn = collect($multipleData)->pluck($referenceColumn)->values()->all();
$bindings = array_merge($bindings, $whereIn);
$whereIn = rtrim(str_repeat('?,', count($whereIn)), ',');
$updateSql = rtrim($updateSql, ", ") . " WHERE `" . $referenceColumn . "` IN (" . $whereIn . ")";
// 传⼊预处理sql语句和对应绑定数据
return DB::update($updateSql, $bindings);
} catch (\Exception $e) {
return false;
}
}
}
可以根据⾃⼰的需求再做调整,下⾯是⽤法实例:
// 要批量更新的数组
$students = [
['id' => 1, 'name' => '张三', 'email' => 'zhansan@qq'],
['id' => 2, 'name' => '李四', 'email' => 'lisi@qq'],批量更新sql语句
];
// 批量更新
app(Students::class)->updateBatch($students);
⽣成的SQL语句如下:
UPDATE pre_students
SET NAME = CASE
WHEN id = 1 THEN
'张三'
WHEN id = 2 THEN
'李四'
ELSE
NAME
END,
email = CASE
WHEN id = 1 THEN
'zhansan@qq'
WHEN id = 2 THEN
'lisi@qq'
ELSE
email
END
WHERE
id IN (1, 2)
是不是效率⼜提⾼了⼀⼤截呢~
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。