我想抓住一个遥远的关系,它不工作。我试过做hasManyThrough
,但这似乎不适用于belongsToMany
关系。这是抛出查询错误。越来越远belongsToMany通过belongsToMany
这里是我的迁移:
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
Schema::create('roles', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
Schema::create('role_user', function (Blueprint $table) {
$table->integer('role_id');
$table->integer('user_id');
});
Schema::create('permissions', function (Blueprint $table) {
$table->increments('id');
$table->string('group');
$table->string('name');
$table->timestamps();
});
Schema::create('permission_role', function (Blueprint $table) {
$table->integer('permission_id');
$table->integer('role_id');
});
这里是我的模型:
class User extends AuthUser
{
//
public function roles()
{
return $this->belongsToMany('App\Role');
}
}
class Role extends Model
{
//
public function permissions()
{
return $this->belongsToMany('App\Permission');
}
}
我想要做的事:
$user = App\User::find(1);
Log::info($user->roles->permissions);
这给了我一个Property [permissions] does not exist on this collection instance.
错误。
如何通过角色获取用户权限?
编辑:
我想出了这个丑陋的解决方案,我想要做的事:
if (auth()->check()) {
if (auth()->user()->roles->contains('name', 'Admin')) {
Gate::before(function() {
return true;
});
}
else {
$permissions = [];
foreach (auth()->user()->roles as $role) {
$permissions = array_merge($permissions, $role->permissions->pluck('name')->all());
}
foreach (array_unique($permissions) as $permission) {
Gate::define($permission, function() {
return true;
});
}
}
}
我该如何提高呢?
用户和角色有多对多的关系? –
你的关系是什么样的?它是一个用户有多个角色,这些角色有很多权限? –
@ImmortalDude是的。 – kjdion84