问题描述
我想要的是拥有一个不同的页面来根据用户的角色显示用户(一个页面用于查看管理员,一个页面用于查看学生等...)
我当然有一个Users table
,一个Roles table
和一个role_user table
角色:
Schema::create('roles',function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
role_user表:
Schema::create('role_user',function (Blueprint $table) {
$table->id();
$table->BigInteger('role_id')->unsigned()->onDelete('cascade');
$table->BigInteger('user_id')->unsigned()->onDelete('cascade');
$table->timestamps();
});
我知道,对你们中的许多人来说似乎很容易,但对我而言却并非如此。我被困住了...
非常感谢!
解决方法
您可以使用双重联接来实现:
modelBuilder.Entity<ThesisRegistration>()
.HasOne(p => p.FirstExaminer)
.WithMany(p => p.ThesisRegistrationsOfFirstExaminer)
.HasForeignKey(p => p.FirstExaminerId)
.OnDelete(DeleteBehavior.NoAction);
modelBuilder.Entity<ThesisRegistration>()
.HasOne(p => p.SecondExaminer)
.WithMany(p => p.ThesisRegistrationsOfSecondExaminer)
.HasForeignKey(p => p.SecondExaminerId)
.OnDelete(DeleteBehavior.NoAction);
或者更好的解决方案是使用laravel many to many relation
像在文档中那样建立关系之后,可以使用whereHas进行操作:
$roleName = 'admin';
$adminUsers = DB::table('users')->join('role_user','users.id','role_user.user_id')
->join('roles','role_user.role_id','roles.id')
->where('roles.name',$roleName)->get();
,
您可以通过在角色和用户的模型文件中添加这两种方法来维护它们之间的一对多关系。
User.php
public function roles() {
return $this->belongsToMany('App\Models\Role','role_user');
}
Role.php
public function users()
{
return $this->belongsToMany('App\Models\User','role_user');
}
因此,您可以使用Role::find(1)->users;
您实际上不需要用户角色的链接表。仅使用Roles
表就可以轻松完成。让我解释一下:
首先,您可以迁移角色表。我假设您已经有该表,但是如果没有,这就是创建一个表的方法
php artisan make:migration create_roles_table
然后您可以相应地填写字段。要与用户建立关系,您需要向用户模型添加角色功能。因此,在您的用户模型中,您可以说
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function role()
{
return $this->belongsTo(Role::class);
}
在“角色”模型中,您可以执行相同操作,但反之亦然。如果您还没有角色模型,则可以使用php artisan make:model Roles
轻松创建一个角色模型。您可以将其添加到“角色”模型中以使关系完整:
public function users()
{
return $this->hasMany(User::class);
}
假设您希望多个用户具有相同的角色,以上是正确的方法
最后,您需要向用户添加一个role_id字段以使关系完成。您可以通过在用户迁移中添加$table->integer('role_id')
来实现此目的。
如果已完成所有设置,则可以执行类似$user->role->name
的操作来获取角色的名称(假设角色表中有一个名为name的字段),并且可以相应地添加不同的规则。例如使用中间件
基于这个确切的原因,您可以创建一个中间件。 php artisan make:middleware name
您可以执行以下操作
class RoleAllowedMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request,Closure $next)
{
$allowed_ids =[1,2];
if(!in_array($request->user()->role_id,$allowed_ids)) {
return redirect('/');
}
return $next($request);
}
}
使某些路由仅具有特定角色的用户可以访问
我希望这是您想要的!
,谢谢大家的回答。
我终于找到了我的问题的答案(我之前没有看到您的帖子...)
这就是我要做的:
public function admins()
{
$adminRole = Role::where('name','admin')->first();
$admins = $adminRole->users;
return view('admin.users.admins',compact('admins'));
}
它工作正常,但是如果有更好的方法,我很乐于学习;)
谢谢大家。
和平