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

Laravel无Controller时查询指定两用户对话消息的代码修改求助

解决方法:筛选指定用户与当前用户的对话消息

你当前的代码只筛选了所有发给你的消息(to = 当前用户ID),没有限定发送方,所以会拿到所有联系人发给你的消息。要只显示和指定用户的对话,需要同时考虑双向的消息:既包括对方发给你的,也包括你发给对方的,并且限定发送/接收方是你们俩。

修改后的代码

<?php 
// 首先定义指定发送方的用户ID,你需要把这个值替换成实际的目标用户ID
// 比如从URL参数、表单或者其他地方获取,这里用示例ID 2
$targetUserId = 2;

// 查询当前用户和目标用户之间的所有消息标题
$subjects = DB::table('messages')
    // 条件1:目标用户发给当前用户的消息
    ->where(function($query) use ($targetUserId) {
        $query->where('to', '=', Auth::user()->id)
              ->where('from', '=', $targetUserId);
    })
    // 条件2:当前用户发给目标用户的消息
    ->orWhere(function($query) use ($targetUserId) {
        $query->where('to', '=', $targetUserId)
              ->where('from', '=', Auth::user()->id);
    })
    // 如果需要去重重复的标题,可以加上 ->distinct()
    // ->distinct()
    ->pluck('title');

// 遍历输出所有对话标题(之前你写的echo $subject是变量名错误,应该遍历$subjects)
foreach ($subjects as $subject) {
    echo $subject . '<br>';
}
?>

关键说明:

  • 用where闭包组合条件,确保两个条件组是或的关系(要么是对方发你的,要么是你发对方的),同时每个条件组里的两个条件是且的关系,精准锁定你们俩的对话。
  • 你需要把$targetUserId替换成实际的指定用户ID,比如如果是从路由获取的,可以用$targetUserId = request()->route('user_id');(根据你的实际场景调整)。
  • 原代码里变量名是$subjects但你写了echo $subject,这是个小错误,上面的代码改成了遍历输出所有标题,更合理。
  • 如果对话里有重复的标题,想要只显示唯一的标题,就在pluck之前加上->distinct()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:16:38