小博_未来往事

TP5 save遍历更新,过滤相邻重复字段,问题汇总

PHP

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

测试准备工作如下:

1.建立一张数据表如下

2.控制器代码如下:    

  1. public function save(){
  2. $model = model('Foo');
  3. for($i=1;$i<=20;$i++){
  4. $data['Hname'] = $i;
  5. $data['Hid'] = $i;
  6. $model->saveDatas($i,$data);
  7. }
  8. echo '遍历更新'.($i-1).'条数据';
  9. }

3.model代码如下:

  1. function saveDatas($id='',$data){
  2. $this->save([
  3. 'Hid' => $data['Hid'],
  4. 'Hname' => $data['Hname']
  5. ], ['id' => $id]);
  6. }

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

  网页:

  数据库:

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

  1. public function save(){
  2. $model = model('Foo');
  3. for($i=1;$i<=20;$i++){
  4. $data['Hname'] = $i;
  5. $data['Hid'] = $i;
  6. if($i==10||$i==11||$i==12||$i==13||$i==14){
  7. $data['Hname'] = 10;
  8. }
  9. $model->saveDatas($i,$data);
  10. }
  11. echo '遍历更新'.($i-1).'条数据';
  12. }

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

网页:

数据库:

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

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

更改model如下:

  1. function saveDatas($id='',$data){
  2. $this->save([
  3. 'Hid' => $data['Hid'],
  4. 'Hname' => $data['Hname']
  5. ], ['id' => $id]);
  6. file_put_contents('record.txt',$this->getLastSql()."\r\t",FILE_APPEND);
  7. }

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

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

打开 thinkphp\library\think\Model.php

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

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

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

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

  1. function saveDatas($id='',$data){
  2. $data['id'] = $id;
  3. $this->data($data,true)->isUpdate(true)->save();
  4. }

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

原文作者:小博
原文地址:http://fity.cn/post/633.html
互联网技术更新较快,本站很多文章具有实效性,我会及时更新原文,但转载的文章无法通知更新。为了不给读者造成困惑或误导,请您在转载时保留此出处信息,尊重别人也是尊重自己。

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。