我想创建一个点对点聊天,我有三个模型,ChatMessage、聊天和用户模型,聊天和用户模型具有多对多关系,我创建了一个数据透视表“chat_user”,并在两个模型上定义了belongToMany。当用户发起聊天时,它会收到 userId 和接收者的 Id,函数如下: public function InitSingleChat(Request $request){ $user = auth()->user(); $receiver = User::findOrFail($request->receiver_id); if ($user) { if ($receiver) { $chat = Chat::find([$user -> id, $receiver -> id])->first(); if ($chat) { return response()->json(['channel' => "private-chat-" . $chat->id, 'chat' => $chat]); } else { $chat = new Chat(); $chat -> save(); $chat -> users() -> attach($user); $chat -> users() -> attach($receiver); return response()->json(['channel' => "private-chat-" . $chat->id, 'chat' => $chat]); } } else { return response()->json('Receiver not found', 404); } } else { return response()->json('You are not signed in', 401); }}这个想法是首先查找两个用户 ID 是否有共同的聊天模型,如果没有,则创建一个新聊天并将两个用户附加到单个聊天中,并返回聊天 ID,否则返回聊天 ID。然而,此块 $chat = Chat::find([$user -> id, $receiver -> id])->first();始终返回 id 与第一个 userId 相关的所有聊天,即($user -> id)。我真正想要的是找到其集合中具有完全相同的两个 userId 的聊天,或者如果不存在则创建一个新的。我也尝试过$chat = Chat::whereIn('id', [$user -> id,$receiver -> id])->get()这就像一个 Or 语句,但需要一个 AND 语句在伪代码中我想要得到的是:
1 回答
杨魅力
TA贡献1811条经验 获得超6个赞
您需要通过关系查询聊天:
$chat = Chat::whereHas('users', function ($query) use ($user, $receiver) { return $query->whereIn('id', [$user->id, $receiver->id]); })->get()->first();
但是,您的数据结构存在一个根本问题。您无法区分数据库中的用户和接收者。相反,您应该将聊天 ID 传递给请求,并且您可以执行如下简单的操作:
$chat = Chat::find($request->id);
请参阅文档https://laravel.com/docs/7.x/eloquent-relationships#querying-relationship-existence
访问模型的记录时,您可能希望根据关系的存在来限制结果。例如,假设您想要检索至少包含一条评论的所有博客文章。为此,您可以将关系的名称传递给
has
和orHas
方法。
如果您需要更多功能,您可以使用
whereHas
和orWhereHas
方法在查询中添加“where”条件has
。这些方法允许您向关系约束添加自定义约束,例如检查评论的内容
- 1 回答
- 0 关注
- 77 浏览
添加回答
举报
0/150
提交
取消