如何使用相关模型获取模型

我想创建一个点对点聊天,


我有三个模型,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 语句


在伪代码中我想要得到的是:


扬帆大鱼
浏览 80回答 1
1回答

杨魅力

您需要通过关系查询聊天:$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。这些方法允许您向关系约束添加自定义约束,例如检查评论的内容
打开App,查看更多内容
随时随地看视频慕课网APP