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