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

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

  测试准备工做以下:thinkphp

1.创建一张数据表以下数据库

2.控制器代码以下:    thinkphp5

复制代码
    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方法,结果测试

  网页:this

  数据库:spa

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

复制代码
    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).'条数据';
    }
复制代码

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

网页:

数据库:

上图咱们能够发现一样执行了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结果以下:

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

打开 thinkphp\library\think\Model.php

上图可看出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行判断条件(不建议);

 

学习下

相关文章
相关标签/搜索