• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > Laravel如何批量更新多条记录(防SQL注入)

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

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了Laravel,批量更新多条记录,防SQL注入等相关知识,希望对您有所帮助

下面给大家介绍关于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)

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


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • laravel与thinkphp之间的区别与优缺点
  • 说说在Laravel中怎么执行Shell命令 ?
  • Laravel中用Observer事件致Redis队列异常问题
  • 手把手带你使用Vue + Laravel开发一个简单的 CRUD 应用
  • 分享个人推荐的Laravel或其它框架的编程规范
  • Laravel中三种中间件的作用
  • 解决Laravel使用laravel-excel扩展包(maatwebsite/excel)导入报错问题
  • 分享一个顺丰同城配送的扩展包并在laravel中使用
  • 介绍Laravel8路由模块新增missing方法
  • 解析如何进行Laravel表单验证分层设计和验证场景应用

相关文章

  • 2022-04-29分析ThinkORM新增加的虚拟模型功能
  • 2022-04-29实战分享:利用nodejs​爬取并下载一万多张图片
  • 2022-04-29VUE动态添加的路由页面刷新时失效的原因及解决方案
  • 2022-04-29怎么在swarm集群里通过service部署wordpress
  • 2022-04-29vue-router两种模式有什么区别
  • 2022-04-29DEDECMS列表页分页输入数字跳转到指定分页代码
  • 2022-04-29解决TP5.1出现A non well formed numeric value encountered的问题
  • 2022-04-29vue中的math.sqrt的用法是什么
  • 2022-04-29浅谈angular9中组件动态加载的实现方法
  • 2022-04-29Composer安装时要求输入授权用户名密码是怎么回事

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • Photoshop绘制逼真的篮球图标教程
    • 详解Laravel前端工程化之mix
    • jQuery如何判断css是否存在
    • 好看短视频解析下载Python脚本
    • PS制作非常逼真的针织吊牌
    • 柒比贰主题网格风格四缩略图对齐样式代码
    • 如何使用PhpSpreadsheet导入导出Excel
    • PhotoShop制作简单的炫光残破文字效果教程
    • WordPress控制文章评论最少字数和最大字数
    • JavaScript和CSS交互的5种方法的学习

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有