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