• 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注入)

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了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表单验证分层设计和验证场景应用

相关文章

  • 关于ThinkPHP多表联合查询的常用方法
  • 手把手教你在html中引入另一个html文件的方法(详解)
  • WordPress子分类页面使用父分类页面模板
  • Photoshop绘制逼真的篮球图标教程
  • LayUI如何导入excel文件
  • 解决thinkphp5中图片处理中遇到的问题
  • Photoshop快速制作漂亮的花朵浮雕字
  • Illustrator设计个性时尚风格的名片教程
  • jQuery sibling是什么意思
  • PHP实现姓名根据首字母排序的类与方法(实例代码)

文章分类

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

最近更新的内容

    • 三种ThinkPHP6中获取参数的方法
    • nginx隐藏index.php的设置方法
    • Photoshop巧用笔刷素材制作的皮革艺术字
    • Photoshop制作精致的橙色石纹立体字
    • Photoshop制作一个古典的小木箱
    • 看看Vue中如何封装一个自动化注册全局组件
    • 帝国CMS如何修改网址+标题+关键字+描叙方法
    • Javascript中事件对象的target和this的区别
    • 解析thinkPHP基于反射实现钩子的方法
    • jquery怎么判断指定子元素是否存在

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

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