前言
相信熟悉laravel的童鞋都知道,laravel有批量一次性插入多条记录,却没有一次性按条件更新多条记录。
是否羡慕thinkphp的saveall,是否羡慕ci的update_batch,但如此优雅的laravel怎么就没有类似的批量更新的方法呢?
高手在民间
google了一下,发现stackoverflow( https://stackoverflow.com/questions/26133977/laravel-bulk-update )上已经有人写好了,但是并不能防止sql注入。
本篇文章,结合laravel的eloquent做了调整,可有效防止sql注入。
示例代码
<?php
namespace appmodels;
use db;
use illuminatedatabaseeloquentmodel;
/**
* 学生表模型
*/
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_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)
是不是效率又提高了一大截呢~
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对硕编程的支持。
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!