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()."\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行判斷條件(不建議);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM