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

 

學習下

相關文章
相關標籤/搜索