zoukankan      html  css  js  c++  java
  • TP5 save遍历更新,过滤相邻重复字段,问题汇总

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

      测试准备工作如下

    1.建立一张数据表如下

    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方法,结果

      网页:

      数据库:

    上图遍历了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).'条数据';
        }

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

    网页:

    数据库:

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

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

    更改model如下:

        function saveDatas($id='',$data){
            $this->save([
                'Hid' => $data['Hid'],
                'Hname' => $data['Hname']
            ], ['id' => $id]);
            file_put_contents('record.txt',$this->getLastSql()."
    	",FILE_APPEND);
        }

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

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

    打开 thinkphplibrary hinkModel.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行判断条件(不建议);

  • 相关阅读:
    创建类以及引用一个类
    修改hosts文件
    微信第三方登录接口开发
    Android定位
    Leetcode 102. Binary Tree Level Order Traversal
    Leetcode 725. Split Linked List in Parts
    Leetcode 445. Add Two Numbers II
    Leetcode 328. Odd Even Linked List
    Leetcode 237. Delete Node in a Linked List
    Leetcode 234. Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/smallbo/p/7005292.html
Copyright © 2011-2022 走看看