You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中Observer的saved方法无法获取模型全部字段问题

问题排查与解决

可能的原因及对应方案

1. 字段未被赋值或未同步数据库默认值

Laravel 的 fillable 仅允许批量赋值,但如果创建/更新模型时未传入目标字段、也未通过 $model->field = value 显式设置,内存中的模型对象会保留 null;另外,数据库字段的默认值不会自动同步到内存模型,仅存储在数据库中。

解决:
在 saved 回调中调用 refresh() 从数据库拉取完整数据:

public function saved(Ticket $model): void
{
    $model->refresh();
    dd($model);
}

2. Observer 注册方式存在隐患

直接在模型 boot 方法中实例化 Observer,可能在模型提前加载的场景下导致绑定异常。建议改用服务提供者注册:
在 AppServiceProvider 的 boot 方法中添加:

public function boot()
{
    Ticket::observe(TicketObserver::class);
}

3. 模型存在全局作用域限制

若模型定义了全局作用域,可能在查询时过滤了部分字段,导致回调中的模型是被作用域处理后的对象。

解决:
临时移除全局作用域后刷新模型:

$model->withoutGlobalScopes()->refresh();

4. 特殊字段类型未配置转换

如果目标字段是 JSON 或其他特殊类型,未在模型中配置 $casts 会导致 Laravel 无法正确解析,显示为 null。例如:

protected $casts = [
    'meta_info' => 'array',
];

内容的提问来源于stack exchange,提问作者KordDEM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 17:22:02