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

Laravel 8 保存数据库通知时notifications表user_id字段恒为NULL如何解决

这不是Laravel的BUG,核心问题是你对Laravel数据库通知的默认表结构设计理解有误。

问题原因

Laravel官方的数据库通知默认采用多态关联设计,原生表结构没有单独的user_id字段,接收通知的主体身份通过两个多态字段识别:

  • notifiable_id:存储接收通知的模型主键
  • notifiable_type:存储接收通知的模型类名

从你提供的SQL日志可以看到,这两个字段已经被正确赋值:notifiable_id = 20(对应用户ID)、notifiable_type = App\Models\User,说明Laravel的通知存储逻辑完全正常。你看到的user_id字段为NULL,是因为你手动在notifications表迁移中额外添加了这个字段,而Laravel默认的存储逻辑不会对自定义字段赋值,自然就为NULL。

另外你当前的通知类代码存在明显错误:toArray方法中调用了未初始化的$this->business和$this->channel属性,构造函数没有传递也没有赋值这两个变量,会触发运行时错误,需要优先修复。

解决方案

根据你的使用场景二选一即可:

  1. 优先推荐:沿用Laravel原生设计,删除多余的user_id字段
    Laravel已经为引入Notifiable trait的User模型预置了notifications关联,直接调用$user->notifications就能获取该用户的所有通知,不需要额外的user_id字段做查询条件。
  2. 如果必须保留自定义的user_id字段
    在通知类中新增toDatabase方法,手动给user_id赋值:
    public function toDatabase($notifiable)
    {
        return [
            'message' => 'You have a new message from ' . $this->sender,
            'link' =>  '/chat/',
            'type' => 'broadcast.message',
            'user_id' => $notifiable->id
        ];
    }
    
    如果你加user_id字段是为了存储发送方ID,将赋值逻辑改为发送方的ID即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 12:27:00