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

Laravel好友通知无法在视图中显示问题求助

问题分析
  1. 通知接收实体错误:你把通知发送给了Friend模型实例,但Friend本质是用户间的关联中间表,并非接收通知的用户实体,导致数据库中notifiable_type为App/Model/Friend,而正确的通知接收者应该是User模型。
  2. 通知集合结构错误:控制器中$notifications[] = $follower->notifications;会生成二维集合数组,视图直接循环时,每个$notification是一个通知集合而非单个通知对象,无法直接访问data['name']。
  3. 视图逻辑不匹配:当前视图的循环逻辑仅适用于一维通知集合,无法处理二维结构的数组。
解决方案

步骤1:完善Friend模型的用户关联

假设friends表包含user_id(当前用户ID)和friend_id(好友用户ID)字段,在Friend模型中定义关联好友用户的方法:

// app/Models/Friend.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Friend extends Model
{
    // 关联好友用户
    public function friendUser()
    {
        return $this->belongsTo(User::class, 'friend_id');
    }
}

步骤2:修正控制器逻辑,发送通知给好友用户

获取当前用户对应的好友User实例,而非Friend实例,再发送通知:

$member->save();

$user = auth()->user();
// 获取当前用户的所有好友用户实例
$followers = Friend::where('user_id', $user->id)
    ->with('friendUser')
    ->get()
    ->pluck('friendUser')
    ->filter(); // 过滤无效关联用户

// 给好友用户发送通知
Notification::send($followers, new Notifiche($member->name));

// 合并所有好友的通知为一维集合(如需在当前页面展示已发送通知)
$notifications = $followers->flatMap(function ($follower) {
    return $follower->notifications;
});

return redirect('/home')->with('notifications', $notifications);

步骤3:修正视图循环逻辑

现在$notifications是一维通知集合,直接循环即可:

@if($notifications->isNotEmpty())
    @foreach ($notifications as $notification)
        <p>{{ $notification->data['name'] }}</p>
    @endforeach 
@else
    <a>+aaa</a>
@endif

关键说明

  • 通知必须发送给User模型实例,确保notifiable_type为App/Model/User,符合Laravel通知系统的设计预期。
  • 使用flatMap将多个用户的通知集合合并为一维集合,避免视图处理二维数组的复杂度。
  • 如果需求是好友登录后查看自己的通知,无需在当前控制器传递notifications,好友登录后直接通过auth()->user()->notifications即可获取,和你给当前用户发通知的逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:02:20