laravel 中的角色问题

Problems with roles in laravel

请注意:我对 laravel 和一般编程还很陌生。

所以我正在为我的 laravel 项目设置一个角色系统,我按照教程做了所有相同的事情。 我的问题是,在注册时,它应该注册一个角色为 'User' 的新用户,但这种情况并没有发生。此外,我的数据库播种没有为我的用户保存任何角色 ID。

我的用户table迁移:

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
            $table->unsignedBigInteger('roles_id')->nullable();
            $table->foreign('roles_id')->references('id')->on('roles');
        });
    }

    public function down()
    {
        Schema::dropIfExists('users');
    }
}

我的角色table迁移:

class CreateRolesTable extends Migration
{
    public function up()
    {
        Schema::create('roles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
        });
    }

    public function down()
    {
        Schema::dropIfExists('roles');
    }
}

我的role_usertable迁移:

class CreateRoleUserTable extends Migration
{

    public function up()
    {
        Schema::create('role_user', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('role_id')->unsigned();
            $table->bigInteger('user_id')->unsigned();
        });
    }

    public function down()
    {
        Schema::dropIfExists('role_user');
    }
}

我的 DataBaseSeeder:

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        // Role comes before User seeder here.
        $this->call(RoleTableSeeder::class);
        // User seeder will use the roles above created.
        $this->call(UserTableSeeder::class);
    }
}

RoleTableSeeder

use Illuminate\Database\Seeder;
use App\Role;

class RoleTableSeeder extends Seeder
{
    public function run()
    {
        $role_worker = new Role();
        $role_worker->name = 'worker';
        $role_worker->save();

        $role_admin = new Role();
        $role_admin->name = 'admin';
        $role_admin->save();

        $role_user = new Role();
        $role_user->name = 'user';
        $role_user->save();
    }
}

UserTableSeeder

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
use App\Role;
use App\User;

class UserTableSeeder extends Seeder
{
    public function run()
    {
        $role_worker = Role::where('name', 'worker')->first();
        $role_admin  = Role::where('name', 'admin')->first();
        $role_user  = Role::where('name', 'user')->first();

        $worker = new User();
        $worker->name = 'Worker User';
        $worker->email = 'worker@worker.com';
        $worker->password = Hash::make('password');
        $worker->save();
        $worker->roles()->attach($role_worker);

        $admin = new User();
        $admin->name = 'Admin user';
        $admin->email = 'admin@admin.com';
        $admin->password = Hash::make('password');
        $admin->save();
        $admin->roles()->attach($role_admin);

        $user = new User();
        $user->name = 'Regular user';
        $user->email = 'user@user.com';
        $user->password = Hash::make('password');
        $user->save();
        $user->roles()->attach($role_user);
    }
}

migrating/seeding

之后的表格

所以,我的问题是,在注册时它应该注册一个角色为 'User' 的新用户,但这种情况并没有发生。此外,我的数据库播种没有为我的用户保存任何 roles_id。

你有一个枢纽关系;无需将 roles_id 列放在您的用户上。从您的迁移中删除这些行:

CreateUsersTable

// $table->unsignedBigInteger('roles_id')->nullable();
// $table->foreign('roles_id')->references('id')->on('roles');

其他一切看起来都不错;您的 rolesusers table 正在填充,并且枢轴正在为 user_idrole_id 设置正确的值。现在,您可以通过

访问用户的角色
$user->roles
// Should return a `Collection` of roles, based on the number of records in `role_user`

作为旁注,您通常不会在 pivot table 上使用自动递增的 ID,因为数据在不断变化,您不太可能引用 role_user.id 在任何时候,所以你也可以删除这一行:

CreateRoleUserTable

// $table->bigIncrements('id');

编辑:这里更大的问题是对 pivotmany-to-many 关系如何运作缺乏基本的理解(没关系,你说你是 Laravel 的新手,并且编程)。

我相信您正试图将 users 上的 roles_id 设置为 role_user.id,但这根本不正确。这不是这种关系的运作方式。它使用中间 table role_user,它有 user_idrole_id 到 link 许多 users 的实例到 [=15= 的许多实例].

如果你要在 users 上设置 roles_id,你只能有一个 role,到那时这将不再是 many-to-many,并且将是 usersroles 之间的简单 link,这将使 role_user table 完全不必要。