【问题标题】:Many-to-many relationship. How to search one common for 2 collections?多对多的关系。如何为 2 个集合搜索一个共同点?
【发布时间】:2018-11-05 00:13:32
【问题描述】:

我的项目中存在多对多关系。 用户 belongsToMany 聊天 和 聊天属于许多用户。

所以,我有一个带有 chat_id 和 user_id 的数据透视表 chat_user。

一个聊天也可以包括一些用户

没问题,效果很好。

当我创建新聊天时,我有 2 个用户。我想检查一下,他们之间是否已经有共同的聊天。

我对这个查询有一些问题。 我还尝试在 chat_user 表上制作自定义模型..但没有运气=( 可能有人做过这样的工作吗?有什么做法吗?谢谢!

【问题讨论】:

    标签: laravel laravel-5 model relationship


    【解决方案1】:

    一种方法是使用whereHas() 查询构建器方法:

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

    作为最佳实践,我个人喜欢将类似的东西合并到模型(在本例中为您的 Chat 模型)作为 query scope 以便于使用:

    // 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();
    

    我认为这非常易读。

    【讨论】:

      【解决方案2】:

      最简单的方法可能是只选择一个用户并寻找另一个用户。假设您的关系是正确的,如下所示:

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

      虽然有多种方法可以在一行中完成此操作,但这通常非常简单。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        • 2013-05-29
        • 2020-09-11
        • 2010-09-25
        • 2021-04-17
        • 1970-01-01
        相关资源
        最近更新 更多