tp5 批量更新多条记录_TP5 save遍历更新,过滤相邻重复字段,问题汇总

TP5中在model中使用save方法遍历更新字段,会自动过滤掉相邻且值重复的字段,在TP5开发手册中也没有提到这一茬,虽然官方有给遍历更新的例子,但是普通的写法程序也不会报错,可能几千条数据中会过滤一两个字段,让开发者很难察觉到错误。而且也实在想不通过滤掉重复的字段的意义在哪里,测试内容如下:

测试准备工作如下:

1.建立一张数据表如下

![](http://images2015.cnblogs.com/blog/1001334/201706/1001334-20170614004111743-584515005.png)

2.控制器代码如下:

public function save(){

$model = model('Foo');

for($i=1;$i<=20;$i++){

$data['Hname'] = $i;

$data['Hid'] = $i;

$model->saveDatas($i,$data);

}

echo '遍历更新'.($i-1).'条数据';

}

3.model代码如下:

------------

function saveDatas($id='',$data){

$this->save([

'Hid' => $data['Hid'],

'Hname' => $data['Hname']

], ['id' => $id]);

}

4.执行程序save方法,结果

网页:

![](http://images2015.cnblogs.com/blog/1001334/201706/1001334-20170614005258821-227307201.png)

数据库:

![](http://images2015.cnblogs.com/blog/1001334/201706/1001334-20170614005412009-820034150.png)

上图遍历了20条数据,没什么问题,接下来把save方法改成如下:(连续四条数据相同)

public function save(){

$model = model('Foo');

for($i=1;$i<=20;$i++){

$data['Hname'] = $i;

$data['Hid'] = $i;

if($i==10||$i==11||$i==12||$i==13||$i==14){

$data['Hname'] = 10;

}

$model->saveDatas($i,$data);

}

echo '遍历更新'.($i-1).'条数据';

}

清除数据库字段重新运行一遍:

网页:

![](http://images2015.cnblogs.com/blog/1001334/201706/1001334-20170614010057368-1410678387.png)

数据库:

![](http://images2015.cnblogs.com/blog/1001334/201706/1001334-20170614010131603-825296186.png)

上图我们可以发现同样执行了20条,连续多条记录字段相同,字段值就会被过滤掉。

接下来我看一下save执行过程:

更改model如下:

function saveDatas($id='',$data){

$this->save([

'Hid' => $data['Hid'],

'Hname' => $data['Hname']

], ['id' => $id]);

file_put_contents('record.txt',$this->getLastSql()."\r\t",FILE_APPEND);

}

运行程序查看 record.txt结果如下:

![](http://images2015.cnblogs.com/blog/1001334/201706/1001334-20170614011145181-1545169837.png)

上图可看出save方法直接过滤掉了Hname字段

打开 thinkphp\library\think\Model.php

![](http://images2015.cnblogs.com/blog/1001334/201706/1001334-20170614012857868-1703209208.png)

上图可看出thinkphp5在封装save方法时对字段进行了筛选

解决方案 1:把$this->save($data) 改为 $this->update($data);

解决方案 2:用$this->saveall($datas) 进行批量更新;

解决方案 3 :修改模型文件为

function saveDatas($id='',$data){

$data['id'] = $id;

$this->data($data,true)->isUpdate(true)->save();

}

解决方案 4:去除model.class 862行判断条件(不建议);

最后更新于 2019-06-27 13:50:27 并被添加「tp5 thinkphp5」标签,已有 2960 位童鞋阅读过。

本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处

相关文章

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
<p> <b><span style="background-color:#FFE500;">【超实用课程内容】</span></b> </p> <p> <br /> </p> <p> <br /> </p> <p> 本课程内容包含讲解<span>解读Nginx的基础知识,</span><span>解读Nginx的核心知识、带领学员进行</span>高并发环境下的Nginx性能优化实战,让学生能够快速将所学融合到企业应用中。 </p> <p> <br /> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><br /> </b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><span style="background-color:#FFE500;">【课程如何观看?】</span></b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> PC端:<a href="https://edu.csdn.net/course/detail/26277"><span id="__kindeditor_bookmark_start_21__"></span></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 移动端:CSDN 学院APP(注意不是CSDN APP哦) </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 本课程为录播课,课程永久有效观看时长,大家可以抓紧时间学习后一起讨论哦~ </p> <p style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <strong><span style="background-color:#FFE500;">【学员专享增值服务】</span></strong> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b>源码开放</b> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化 </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 下载方式:电脑登录<a href="https://edu.csdn.net/course/detail/26277"></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a>,播放页面右侧点击课件进行资料打包下载 </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页