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
相关产品推荐
相关产品推荐

