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
之后的表格
- roles table
- role_user table
- users_table
所以,我的问题是,在注册时它应该注册一个角色为 'User' 的新用户,但这种情况并没有发生。此外,我的数据库播种没有为我的用户保存任何 roles_id。
你有一个枢纽关系;无需将 roles_id
列放在您的用户上。从您的迁移中删除这些行:
CreateUsersTable
// $table->unsignedBigInteger('roles_id')->nullable();
// $table->foreign('roles_id')->references('id')->on('roles');
其他一切看起来都不错;您的 roles
和 users
table 正在填充,并且枢轴正在为 user_id
和 role_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');
编辑:这里更大的问题是对 pivot
和 many-to-many
关系如何运作缺乏基本的理解(没关系,你说你是 Laravel 的新手,并且编程)。
我相信您正试图将 users
上的 roles_id
设置为 role_user.id
,但这根本不正确。这不是这种关系的运作方式。它使用中间 table role_user
,它有 user_id
和 role_id
到 link 许多 users
的实例到 [=15= 的许多实例].
如果你要在 users
上设置 roles_id
,你只能有一个 role
,到那时这将不再是 many-to-many
,并且将是 users
和 roles
之间的简单 link,这将使 role_user
table 完全不必要。
请注意:我对 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
之后的表格- roles table
- role_user table
- users_table
所以,我的问题是,在注册时它应该注册一个角色为 'User' 的新用户,但这种情况并没有发生。此外,我的数据库播种没有为我的用户保存任何 roles_id。
你有一个枢纽关系;无需将 roles_id
列放在您的用户上。从您的迁移中删除这些行:
CreateUsersTable
// $table->unsignedBigInteger('roles_id')->nullable();
// $table->foreign('roles_id')->references('id')->on('roles');
其他一切看起来都不错;您的 roles
和 users
table 正在填充,并且枢轴正在为 user_id
和 role_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');
编辑:这里更大的问题是对 pivot
和 many-to-many
关系如何运作缺乏基本的理解(没关系,你说你是 Laravel 的新手,并且编程)。
我相信您正试图将 users
上的 roles_id
设置为 role_user.id
,但这根本不正确。这不是这种关系的运作方式。它使用中间 table role_user
,它有 user_id
和 role_id
到 link 许多 users
的实例到 [=15= 的许多实例].
如果你要在 users
上设置 roles_id
,你只能有一个 role
,到那时这将不再是 many-to-many
,并且将是 users
和 roles
之间的简单 link,这将使 role_user
table 完全不必要。