您好,欢迎访问一九零五行业门户网

laravel如何批量更新多条记录(防SQL注入)

下面由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注入)的详细内容。
其它类似信息

推荐信息