JaguarJack / catch-admin

CatchAdmin是一个基于对Laravel和Element Plus进行二次开发的后台管理系统。CatchAdmin仍然采用传统的前后端分离策略,其中Laravel框架仅用作Api输出。通过这种设计,成功将管理系统模块之间的耦合降至最低。
https://catchadmin.com
Apache License 2.0
676 stars 114 forks source link

updateBy 等方法,导致 `think\model` 的事件参数参数不能正确传递 #36

Closed gavin887 closed 1 year ago

gavin887 commented 2 years ago

BaseOptionsTrait.php: 78

    public function updateBy($id, $data, string $field = ''): bool
    {
        if (static::update($this->filterData($data), [$field ? : $this->getPk() => $id], $this->field)) {

            $this->updateChildren($id, $data);

            return true;
        }

        return false;
    }

事件触发时,会吧触发事件的 model 作为参数传入事件处理方法中, 而 static::update 使用的是 new static(), 所以事件处理方法中接受到的 $model 是一个新的空对象。。。

JaguarJack commented 2 years ago

最佳实践

更新的最佳实践原则是:如果需要使用模型事件,那么就先查询后更新,如果不需要使用事件或者不查询直接更新,直接使用静态的Update方法进行条件更新,如非必要,尽量不要使用批量更新。

这是文档讲的,你是用事件,需要先查询,再更新。直接更新是不会触发事件。

gavin887 commented 2 years ago

嗯嗯, 生成器这边 catcher/generate/factory/Controller.php 的 update 方法 使用的是 updateBy 所以提一下,看有没有修改的必要。

JaguarJack commented 2 years ago

嗯嗯, 生成器这边 catcher/generate/factory/Controller.php 的 update 方法 使用的是 updateBy 所以提一下,看有没有修改的必要。

可以先用 save 更新。容我看看改动之后影响大不大