簡體   English   中英

如何使用其相關型號獲得 model

[英]How to get a model using its related models

我想創建一個點對點聊天,

我有三個模型,ChatMessage,聊天和用戶 model,聊天和用戶 model 有一個多對多的關系,我創建了一個 pivot 表'ychat_user'。

當用戶發起聊天時,它會收到 userId 和接收者的 Id,這里是 function:

 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 是否有共同的聊天 model,如果沒有,則創建一個新聊天並將兩個用戶附加到一個聊天,並返回聊天 id,否則返回聊天 id。

這個塊$chat = Chat::find([$user -> id, $receiver -> id])->first(); 但是總是返回與第一個 userId 相關的所有聊天 id 即 ($user -> id)。

我真正想要的是找到在其集合中具有確切兩個 userId 的聊天,或者如果它不存在則創建一個新的。

我也試過$chat = Chat::whereIn('id', [$user -> id,$receiver -> id])->get()這就像一個 Or 語句,而需要一個 AND 語句

在偽代碼中,我想要得到的是:

您需要通過關系查詢聊天:

$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

在訪問 model 的記錄時,您可能希望根據關系的存在來限制結果。 例如,假設您想要檢索至少有一條評論的所有博客文章。 為此,您可以將關系名稱傳遞給hasorHas方法。

如果您需要更多功能,您可以使用whereHasorWhereHas方法將“where”條件放在您的has查詢上。 這些方法允許您將自定義約束添加到關系約束,例如檢查評論的內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM