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行判断条件(不建议);

    学习下

  • 相关阅读:
    第四章之Hadoop I/O
    第五章之MapReduce应用开发
    数据预处理
    SQL Server Migration Assistant for MySQL!
    【转载】.NET设计模式之工厂方法模式(Factory Method)
    "lc.exe"已退出 代码为1 的解决方法
    【转载】.NET设计模式之抽象工厂模式(Abstract Factory)
    【转载】(收藏)《博客园精华集》分类索引
    【转载】.NET设计模式之观察者模式(Observer Pattern)
    【转载】使用Visual Studio 2010调试断点不起作用的问题解决办法(AutoCAD)
  • 原文地址:https://www.cnblogs.com/njccqx/p/11731089.html
Copyright © 2011-2022 走看看