资讯专栏INFORMATION COLUMN

laravel批量更新多条记录,可防止SQL注入

Drummor / 2438人阅读

摘要:写在前面熟悉的童鞋都知道,有批量一次性插入多条记录,却没有一次性按条件更新多条记录。本篇文章,结合的做了调整,可有效防止注入。

写在前面

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

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

高手在民间

Google了一下,发现stackoverflow( https://stackoverflow.com/que... )上已经有人写好了,但是并不能防止sql注入。

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

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)
    

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

原文 http://www.tech1024.cn/origin...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30626.html

相关文章

  • jdbc就是这么简单

    摘要:使用执行单元测试查询获取连接对象根据连接对象,得到执行语句,返回遍历结果集查询获取连接对象根据连接对象,得到执行添加影响的行数,,如果大于表明操作成功。否则失败更新成功更新失败光标选中方法名字,然后右键执行单元测试。 文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、JDBC JAVA Database Connectivi...

    li21 评论0 收藏0
  • Java JDBC编程

    摘要:和很像,严格来说,应该是模仿了是设计。程序中使用该类的主要功能是获取对象,该类包含如下方法该方法获得对应数据库的连接代表数据库连接对象,每个代表一个物理连接会话。当执行查询时,返回查询到的结果集。程序可以通过操作该对象来取出查询结果。 JDBC基础 JDBC的全称是Java Database Connectivity,即Java数据库连接,它是一种可以执行SQL语句的Java API。...

    邹强 评论0 收藏0
  • Laravel5 基础查询构造器

    摘要:原生语句使用原生语句查询请先引入查询语句语句执行成功返回插入语句语句执行成功返回修改语句语句返回受影响行数删除语句语句返回删除行数注建议语句中的变量请尽量使用占位,然后在执行时使用数组的方式替换,有助于防止注入攻击。 原生SQL语句 使用原生sql语句查询请先引入 use IlluminateSupportFacadesDB; 查询语句 // sql 语句 $sql = SELECT ...

    Doyle 评论0 收藏0
  • gf框架之gdb - 优雅强大的数据库ORM

    摘要:文章来源框架的数据库操作由包提供支持,包经过非常精心优雅的设计,提供了非常强大的配置管理方法操作链式操作事务操作等功能。其他链式操作请参考上述链式操作章节。 文章来源:http://gf.johng.cn/494380 gf框架的数据库ORM操作由gdb包提供支持,gdb包经过非常精心优雅的设计,提供了非常强大的配置管理、方法操作、链式操作、事务操作等功能。gdb包具体API说明文档详...

    muzhuyu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<