【发布时间】:2019-04-20 13:07:16
【问题描述】:
假设我有一个用户、角色和一个数据透视表。我为 Role 和 User 设置了 belongsToMany。
用户模型:
<?php
namespace App;
...
use App\Models\Role;
class User extends Authenticatable
{
...
public function roles()
{
return $this->belongsToMany(Role::class, "UserRoles", "userId", "roleId")
->withPivot("read", "write", "update", "delete")
->withTimestamps();
}
}
榜样:
<?php
namespace App\Models;
...
use App\User;
class Role extends Model
{
...
public function users()
{
return $this->belongsToMany(User::class, "UserRoles", "roleId", "userId")
->withPivot("read", "write", "update", "delete")
->withTimestamps();
}
}
表“用户”:
userId username
1 admin
2 johndoe
3 menghour
表“角色”:
roleId roleName
1 Admin
2 HR
3 Account
数据透视表“UserRoles”:
id userId roleId read write update delete
1 1 1 1 1 1 1
2 1 2 1 1 1 1
3 1 3 1 1 1 1
4 2 2 1 0 0 0
5 3 3 1 1 1 0
我的问题是如何在数据透视表中获取过滤器。
例如:我只想过滤userId或roleId或两者都过滤userId and roleId
如果我在刀片模板中选择user = admin,我想获取用户拥有的所有角色。
预期结果:
username roleName
admin Admin
admin HR
admin Account
如果我在刀片模板中选择选项role = HR,我想获得该角色拥有的所有用户。
预期结果:
username roleName
admin HR
johndoe HR
如果我选择选项user = admin 和role = HR,我只想获取特定的用户和角色。
预期结果:
username roleName
admin HR
我累了:
User::whereHas("roles", function ($query) use ($request) {
if ($request->userId) {
$query->where("userRoles.userId", "=", $request->userId);
}
if ($request->roleId) {
$query->where("userRoles.roleId", "=", $request->roleId);
}
})->get();
注意:我使用的是 Laravel 5.7
【问题讨论】:
标签: php laravel eloquent many-to-many relationship