catch-admin icon indicating copy to clipboard operation
catch-admin copied to clipboard

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

Open gavin887 opened this issue 3 years ago • 3 comments

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 是一个新的空对象。。。

gavin887 avatar Nov 12 '21 09:11 gavin887

最佳实践

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

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

JaguarJack avatar Nov 12 '21 10:11 JaguarJack

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

gavin887 avatar Nov 14 '21 12:11 gavin887

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

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

JaguarJack avatar Nov 15 '21 00:11 JaguarJack