laravel中用模型的update()方法更新数据时,属性修改器没有生效

在 Laravel 中,如果你在使用 Eloquent 模型的 update() 方法更新数据时发现属性修改器没有生效,这可能是由于以下几个原因造成的:

原因分析:

  1. 直接传递数组参数:当你直接使用关联数组作为 update() 方法的参数时,Eloquent 并不会调用属性修改器。这是因为修改器通常在属性被设置时触发,而传递数组是直接更新数据库字段,绕过了模型层的属性设置逻辑。
  2. 未通过模型实例调用:如果你没有首先通过模型实例调用修改器并设置属性,而是直接使用查询构造器更新,那么修改器自然不会被触发。

解决方法:

先填充模型实例:在调用 update() 之前,先通过 fill() 方法填充模型实例,这样会在填充属性时触发相应的属性修改器。

    $model = Model::find($id);
    $data = request()->only(['column1', 'column2']);
    $model->fill($data); // 这里会触发属性修改器
    $model->save(); // 或者 $model->update();

    使用模型方法封装更新逻辑:在模型内部创建一个方法来封装更新逻辑,确保在更新前通过模型的属性设置流程。

    class MyModel extends Model
    {
        public function updateWithModifiers(array $data)
        {
            foreach ($data as $key => $value) {
                $this->{$key} = $value; // 这里会调用属性修改器
            }
            $this->save();
        }
    }
    
    $model = MyModel::find($id);
    $model->updateWithModifiers(request()->only(['column1', 'column2']));

    利用 Eloquent 事件:如果属性修改逻辑较为复杂,还可以考虑使用 Eloquent 的模型事件(如 updatingupdated)来处理更新前后的逻辑。

    确保修改器正确实现:最后,再次检查你的属性修改器(setter)是否正确实现,并且确认属性名与传递的键名一致。

      Was this helpful?

      0 / 0

      发表回复 0