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

Laravel私信系统问题:无法展示用户间收发双方消息

解决Laravel私信系统只显示发送消息的问题

嘿,我明白你的问题啦!你当前的查询只筛选了当前用户作为发件人的消息,所以自然看不到对方发给你的内容。咱们只需要调整查询条件,把双方之间的所有消息都捞出来就行~

修改控制器查询逻辑

你需要修改MessageController.php里的viewMessage方法,让查询同时包含两种情况:

  1. 当前用户是发件人,对方是收件人
  2. 当前用户是收件人,对方是发件人

这里要注意用闭包分组条件,避免逻辑混乱:

public function viewMessage($recipient_id){ 
    $currentUserId = auth()->user()->id; 
    // 获取双方之间的所有消息
    $messages = Message::where(function($query) use ($currentUserId, $recipient_id) {
        // 我发给对方的消息
        $query->where('sender_id', $currentUserId)
              ->where('recipient_id', $recipient_id);
    })->orWhere(function($query) use ($currentUserId, $recipient_id) {
        // 对方发给我的消息
        $query->where('sender_id', $recipient_id)
              ->where('recipient_id', $currentUserId);
    })
    ->orderBy('created_at', 'asc') // 按时间正序排列,旧消息在前
    ->get(); 

    return view ('pages.messages.view', compact('currentUserId', 'messages')); 
}

优化视图展示(可选)

为了让界面更友好,你可以在Blade视图里区分自己发送和接收的消息,方便做样式区分:

<ul> 
    @foreach ($messages as $message) 
        <li class="{{ $message->sender_id == $currentUserId ? 'sent' : 'received' }}">
            {{ $message->body }}
        </li> 
    @endforeach 
</ul>

之后你就可以用CSS给.sent和.received设置不同的样式,比如:

.sent {
    text-align: right;
    background-color: #dcf8c6;
    margin-left: 20%;
}
.received {
    text-align: left;
    background-color: #ffffff;
    margin-right: 20%;
}

这样你的私信页面就能完整展示双方的所有消息啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:26:50