bugfix> laravel > 投稿

私のプロジェクトには多対多の関係があります。 ユーザーbelongsToManyチャット そして チャットはbelongsToManyユーザーです。

だから、私はchat_idとuser_idを持つピボットテーブルchat_userを持っています。

1つのチャットに一部のユーザーを含めることもできます

その大丈夫とうまく動作します。

新しいチャットを作成するとき、2人のユーザーがいます。そして、私は確認したいのですが、彼らの間にはすでに一般的なチャットがあります。

このクエリにはいくつか問題があります。 また、chat_userテーブルでカスタムモデルを作成しようとしましたが、運がありません=( 誰かがそのような仕事をしたことがありますか?練習はありますか?ありがとうございました!

回答 2 件
  • 1つの方法は、whereHas()クエリビルダーメソッドを使用することです。

    $user1->chats()->whereHas('users', function($q) use ($user2) {
        $q->where('user_id', '=', $user2->id);
    })->get();
    
    

    ベストプラクティスとして、個人的には、そのようなものをクエリスコープとしてモデル(この場合はチャットモデル)に統合して、使いやすくします。

    // class App\Chat
    public function scopeWithUser($query, User $user)
    {
        $query->whereHas('users', function ($q) use ($user) {
            $q->where('user_id', '=', $user->id);
        });
    }
    
    

    その後、次のように使用できます。

    // get common chats between user1 and user2
    $user1->chats()->withUser($user2)->get();
    // see if a common chat exists
    $user1->chats()->withUser($user2)->exists();
    
    

    とても読みやすいと思います。

  • 最も簡単な方法は、おそらく1人のユーザーを取得して、もう1人のユーザーを探すことです。あなたの関係が正しいと仮定すると、このようなもの:

    $firstUserChats = $firstUser->chats()->pluck('user_id');
    $usersHaveACommonChat = $firstUserChats->contains($secondUser->id);
    
    

    これを1行で実行する方法はありますが、通常はこれと同じくらい簡単です。 :)

あなたの答え