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属性,构造函数没有传递也没有赋值这两个变量,会触发运行时错误,需要优先修复。
解决方案
根据你的使用场景二选一即可:
- 优先推荐:沿用Laravel原生设计,删除多余的user_id字段
Laravel已经为引入Notifiabletrait的User模型预置了notifications关联,直接调用$user->notifications就能获取该用户的所有通知,不需要额外的user_id字段做查询条件。 - 如果必须保留自定义的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
相关产品推荐
相关产品推荐

