如何在基于多对多关系的 sql 查询中获取具有所有角色的所有用户?

问题描述

目标
获取所有用户的所有角色。

问题
如果一个用户拥有多个角色,我会为他拥有的每个角色获取一个用户的实例。

说明
我有一个包含三个表的设置,例如 this stackoverflow post 中的描述。 user 表、role 表和 role_user 表。 现在我想用这个查询查询所有用户的角色:

$allUsers = DB::table('users')
            ->join('role_user','role_user.user_id','=','users' . '.id')
            ->join('roles','roles.id','role_user.role_id')
            ->select(['users.uuid','users.username','users.last_online_at','roles.role','roles.id as role_id'])
            ->get();

对我来说,它看起来与我在上面已经提到的 stackoverflow 帖子的第二篇文章中制作 Lizesh Shakya 的普通 MysqL 查询建议完全一样。 除了我使用 Laravel 的事实。而且我知道,我可以使用用户模型解决它,并在其中设置适当的 belongsToMany 方法和角色模型。但我想更深入地了解它,因此我尝试这样做。 例如,如果我有三个用户,并且一个用户具有“编辑器”和“作者”角色,则查询将返回四个用户。每个角色一个

Illuminate\Support\Collection {#1267 ▼
  #items: array:4 [▼
    0 => {#1273 ▼
      +"uuid": "fc8bbd29-9005-4f05-9706-a437933d3bc2"
      +"username": "admin"
      +"last_online_at": "2021-01-16 19:01:37"
      +"role": "admin"
      +"role_id": 1
    }
    1 => {#1272 ▼
      +"uuid": "d957e5af-f8f3-4a07-a2c3-eabecbdda618"
      +"username": "author1"
      +"last_online_at": "2021-01-16 19:01:37"
      +"role": "author"
      +"role_id": 3
    }
    2 => {#1282 ▼
      +"uuid": "dc94d900-bbaf-4605-b8d8-6bab5fb43b70"
      +"username": "editor"
      +"last_online_at": "2021-01-16 19:01:37"
      +"role": "editor"
      +"role_id": 2
    }
    3 => {#1281 ▼
      +"uuid": "d957e5af-f8f3-4a07-a2c3-eabecbdda618"
      +"username": "author1"
      +"last_online_at": "2021-01-16 19:01:37"
      +"role": "editor"
      +"role_id": 2
    }
  ]
}

那么我的错在哪里? :)

解决方法

所以,如果我理解正确的话,您想要一份包含其角色的用户列表吗?

在您的用户控制器上:


   public function getUsersWithRoles(){
         $all_users = User::all()->load('roles');

         $body = compact('all_users');   
        
         return response()->json(compact('body')); 
   }


   public function getUsersWithRoles(){
         $all_users = User::with('roles')->get();

         $body = compact('all_users');   
        
         return response()->json(compact('body')); 
   }

不要忘记在模型中声明你的关系。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...