为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
扬帆大鱼 2023-09-15 21:38:05
我想创建一个点对点聊天,我有三个模型,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条经验 获得超5个赞

您需要通过关系查询聊天:

$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

访问模型的记录时,您可能希望根据关系的存在来限制结果。例如,假设您想要检索至少包含一条评论的所有博客文章。为此,您可以将关系的名称传递给hasorHas方法。

如果您需要更多功能,您可以使用whereHasorWhereHas方法在查询中添加“where”条件has。这些方法允许您向关系约束添加自定义约束,例如检查评论的内容


查看完整回答
反对 回复 2023-09-15
  • 1 回答
  • 0 关注
  • 48 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信