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 更新数据时调用是没有传值的
所以我在这里写的条件判断影响了后面的使用
取消条件判断试了下 问题解决 条件判断在想其他办法来做好了 总算是把这个问题解决了
之前翻了好久手册也没找到相关的说明 或是类似的解决方案
没找到不能说明手册中没有 有哪位朋友在手册找到相关的说明可以分享下