laravel实现批量更新多条记录的方法示例
程序员文章站
2022-05-21 10:48:28
前言
相信熟悉laravel的童鞋都知道,laravel有批量一次性插入多条记录,却没有一次性按条件更新多条记录。
是否羡慕thinkphp的saveall,是否羡慕c...
前言
相信熟悉laravel的童鞋都知道,laravel有批量一次性插入多条记录,却没有一次性按条件更新多条记录。
是否羡慕thinkphp的saveall,是否羡慕ci的update_batch,但如此优雅的laravel怎么就没有类似的批量更新的方法呢?
高手在民间
google了一下,发现*( )上已经有人写好了,但是并不能防止sql注入。
本篇文章,结合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.com'], ['id' => 2, 'name' => '李四', 'email' => 'lisi@qq.com'], ]; // 批量更新 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.com' when id = 2 then 'lisi@qq.com' else email end where id in (1, 2)
是不是效率又提高了一大截呢~
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。