Laravel 10中morphMany关联无法获取NotificationNotifiable模型问题
针对你遇到的NotificationType通过morphMany关联NotificationNotifiable返回空的问题,常见原因如下:
多态关联字段名不匹配
Laravel多态关联默认依赖{关联标识}_type和{关联标识}_id格式的字段(比如notifiable_type、notifiable_id)。如果你的notification_notifiables表字段名不是这两个,或者在NotificationType的morphMany定义中未显式指定正确字段,就会导致关联查询失败。比如:
错误示例:// 未指定正确的多态字段或外键 return $this->morphMany(NotificationNotifiable::class);正确示例(确保外键与表字段对应):
return $this->morphMany(NotificationNotifiable::class, 'notifiable', null, 'notification_type_id');模型类名/命名空间不匹配
多态关联的notifiable_type字段必须存储模型的完整命名空间类名(比如App\Models\User)。如果数据库中该字段值是简写(如User)、大小写错误(如app\Models\User),或者模型类名/命名空间修改后未同步数据库数据,关联会无法匹配到对应模型。关联方法参数顺序错误
morphMany方法的参数顺序容易混淆,正确顺序是:morphMany(关联模型类名, 多态关联标识, 多态类型字段名, 多态ID字段名, 外键字段名)
如果参数顺序写错(比如把外键放在了多态标识的位置),会导致生成的SQL查询条件错误,返回空结果。查询时的预加载或约束错误
控制器加载通知渠道和类型时,若未正确预加载notificationNotifiables,或者预加载时的筛选条件错误(比如未指定notifiable_id为当前用户ID、notifiable_type为User模型类名),会导致关联数据无法被正确筛选出来。比如:
错误示例:// 未添加用户筛选约束 NotificationChannel::with('notificationTypes.notificationNotifiables')->get();正确示例:
$userId = 1; NotificationChannel::with(['notificationTypes.notificationNotifiables' => function ($query) use ($userId) { $query->where('notifiable_type', User::class) ->where('notifiable_id', $userId); }])->get();数据库数据不一致
检查notification_notifiables表的记录:notification_type_id是否对应notification_types表中存在的IDnotifiable_id是否为当前用户的IDnotifiable_type是否与User模型的完整类名完全一致
内容的提问来源于stack exchange,提问作者Ryan H

