在 Laravel 中,如果你在使用 Eloquent 模型的 update()
方法更新数据时发现属性修改器没有生效,这可能是由于以下几个原因造成的:
原因分析:
- 直接传递数组参数:当你直接使用关联数组作为
update()
方法的参数时,Eloquent 并不会调用属性修改器。这是因为修改器通常在属性被设置时触发,而传递数组是直接更新数据库字段,绕过了模型层的属性设置逻辑。 - 未通过模型实例调用:如果你没有首先通过模型实例调用修改器并设置属性,而是直接使用查询构造器更新,那么修改器自然不会被触发。
解决方法:
先填充模型实例:在调用 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 的模型事件(如 updating
、updated
)来处理更新前后的逻辑。
确保修改器正确实现:最后,再次检查你的属性修改器(setter)是否正确实现,并且确认属性名与传递的键名一致。
Was this helpful?
0 / 0