laravel检索值匹配数据透视表的所有用户

时间:2019-03-30 16:09:28

标签: php mysql laravel eloquent

因此,我试图在user rolesprofiles之间建立联系,但一切在创建时都可以正常工作,但是当我想按特定角色列出用户时,我不知道如何过滤掉或个人资料。

这是我现在拥有的表结构。每个表都与其模型相对应,因此表users具有模型Userroles具有模型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_id 3匹配,role_id在角色表中的角色为OPERATOR。

1 个答案:

答案 0 :(得分:0)

您可以通过将用户表联接到数据透视表并根据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();