按角色过滤用户Laravel

问题描述

我有一个带有多个用户和不同角色的小型Laravel应用。

我想要的是拥有一个不同的页面来根据用户的角色显示用户一个页面用于查看管理员一个页面用于查看学生等...)

我当然有一个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'));
}

它工作正常,但是如果有更好的方法,我很乐于学习;)

谢谢大家。

和平

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...