2017/06/14 PHP/Python/Java No Comments 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」标签,已有 4753 位童鞋阅读过。 本文作者:未来往事 本文链接:https://felixway.cn/post/633.html 本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处 相关文章 tp5 Excel表格导入_tp5导出Excel tp5分页 搜索条件不保留/失效处理方法 tp5 save遍历新增数据第二次变为update问题处理
此处评论已关闭