setFieldOriginalValue出現問題:在使用 laravel-admin 的時候 使用自帶的編輯功能 更新數據 提示更新成功但是數據庫中的數據沒有發生變化
遇到這個情況我首先想到的是會不會是model沒寫好 排查了下 $fillable 里面的值沒毛病
然后手寫了個ORM 更新數據發現 可以正常使用 這里我們排除 model 的問題
沒辦法只能 一步一步跟代碼排除問題 (這里主要寫解決思路和排查過程 有類似問題的朋友可以直接翻到最后)
這里我是拿出問題的 控制器和之前沒出問題的控制器進行比較來排除問題的
Controller 里面的 form() 這個方法 在edit 時 編輯表單正常顯示 功能正常使用沒有問題
然后我開始排查 Encore\Admin\Form 里面的update 方法 在474行 左右
這里發現兩個控制器獲取到的值相同 也沒有問題 直到
494行
$this->setFieldOriginalValue();時發現
$this->builder->fields()->each
這里 each 這個函數是作為遍歷使用的 我打印了下$this->builder->fields() 的值
發現兩個已經有區別了
正常的控制器中 有個 Collection 對象
而異常的控制器中 什么都沒有
這里我找到 Collection 實在 $this->builder 這個對象被 __construct 時放入的 builder對象是在 form 被 __construct 放入的 這里我在
form 的 __construct 方法中 打印了一下 發現兩個控制器的結果值是相同的
然后一步一步排查 發現並沒有什么用 然而還是沒有找到 Collection 這個對象是在哪被放入的
就想起來排查下 HasResourceActions
vendor\encore\laravel-admin\src\Controllers\HasResourceActions.php
既然繼承的是他的 update 哪問題有很大可能是在這里
這里我們 return $this->form()->update($id);
看到 form() 找了一下沒有找到他里面有form() 這個方法於是 就想到了form() 可能是 所使用控制器中定義的
form() 方法 畢竟所使用的控制器 也是繼承於他的 這個 $this 應該是所使用的控制器
想到就試一下 斷點了一下發現果然還是他
這里發現我是在編輯的時候 向 form() 傳了兩個值
但是在laravel-admin 更新數據時調用是沒有傳值的
所以我在這里寫的條件判斷影響了后面的使用
取消條件判斷試了下 問題解決 條件判斷在想其他辦法來做好了 總算是把這個問題解決了
之前翻了好久手冊也沒找到相關的說明 或是類似的解決方案
沒找到不能說明手冊中沒有 有哪位朋友在手冊找到相關的說明可以分享下