当前位置:首页 > PHP教程 > PHP常见问题

laravel实现批量更新多条记录的方法示例

前言

相信熟悉laravel的童鞋都知道,laravel有批量一次性插入多条记录,却没有一次性按条件更新多条记录。

是否羡慕thinkphp的saveall,是否羡慕ci的update_batch,但如此优雅的laravel怎么就没有类似的批量更新的方法呢?

高手在民间

google了一下,发现stackoverflow( https://stackoverflow.com/questions/26133977/laravel-bulk-update )上已经有人写好了,但是并不能防止sql注入。

本篇文章,结合laravel的eloquent做了调整,可有效防止sql注入。

示例代码

<?php namespace appmodels; use db; use illuminatedatabaseeloquentmodel; /** * 学生表模型 */ 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)

是不是效率又提高了一大截呢~

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对硕编程的支持。



【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!