下面由laravel教程栏目给大家介绍关于laravel批量更新多条记录,可防止sql注入,希望对需要的朋友有所帮助!
laravel批量更新多条记录,可防止sql注入写在前面熟悉laravel的童鞋都知道,laravel有批量一次性插入多条记录,却没有一次性按条件更新多条记录。
是否羡慕thinkphp的saveall,是否羡慕ci的update_batch,但如此优雅的laravel怎么就没有类似的批量更新的方法呢?
高手在民间google了一下,发现stackoverflow(https://stackoverflow.com/questions/26133977/laravel-bulk-update)上已经有人写好了,但是并不能防止sql注入。
本篇文章,结合laravel的eloquent做了调整,可有效防止sql注入。
<?phpnamespace 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_studentsset name = casewhen id = 1 then '张三'when id = 2 then '李四'else nameend, email = casewhen id = 1 then 'zhansan@qq.com'when id = 2 then 'lisi@qq.com'else emailendwhere id in (1, 2)
是不是效率又提高了一大截呢~
相关推荐:最新的五个laravel视频教程
以上就是laravel如何批量更新多条记录(防sql注入)的详细内容。