因此,我试图在用户
角色
和配置文件
之间建立关系,所有工作都是在创建时连接起来的,但我不知道当我想按特定的角色或配置文件列出用户时如何过滤掉。
下面是我现在拥有的一个表结构。每个表与其模型相对应,因此表users
具有模型user
表role
具有模型role
并且有一个数据透视表role_user
将用户与角色连接起来。
这将是角色表
+----+----------+---------------+
| id | name | Description |
+----+----------+---------------+
| 1 | admin | Administrator |
| 2 | client | Client |
| 3 | operator | Operator |
+----+----------+---------------+
这将是用户角色的透视表
+----+---------+---------+
| id | user_id | role_id |
+----+---------+---------+
| 1 | 1 | 3 |
| 2 | 2 | 1 |
+----+---------+---------+
这通常是用户表
+----+--------+-----------------+
| id | name | Email |
+----+--------+-----------------+
| 1 | Mario | mario@email.tld |
| 2 | Luighi | lui@email.tld |
+----+--------+-----------------+
所以如果我要列出所有帐户,这非常简单,因为我将使用
public function index(Request $request)
{
$users = User::get();
return view('users/index', compact('users'));
}
如果我想通过特定的名称或电子邮件筛选用户,我只需要筛选
$users = User::where('name', 'Mario')->get();
这将检索匹配名为Mario的所有用户。
现在,更复杂的事情是我偶然发现的,我在网上找不到答案。
我想检索数据透视表中的用户角色与角色表中的角色匹配的所有用户。
例如:
Retrieve All Users WHERE (pivot table) role_user EQUALS name OPERATOR from role table
这将返回用户Mario,因为他的用户id是1,并且在数据透视表中,user_id匹配role_id3,而role_id在rooles表中是role named operator。
您可以通过将user表连接到数据透视表并在where role_id=operator_id上进行筛选来实现
$operator_id =
DB::table('roles')->where('name','=','operator')->first()->id;
DB::table('users') ->join('pivot', function ($join)
{ $join->on('users.id', '=', 'pivot.user_id') ->where('pivot.role_id',
'=', $operator_id); }) ->get();