我目前学习Laravel 5.8,并创建了一个数据库,其中users
可以扮演两个角色:存储在admin
表中的user
或roles
。我试图填充role_users
中间表,但是Laravel将行加倍并植入了错误的数据,例如:Crazy ROLE_USER Table。 role_id
应该只有1或2。user_id
应该是唯一的。我做错了什么?
用户模型:
public function roles() {
return $this->belongsToMany('App\Role', 'role_users')->withTimestamps();
}
角色模型:
public function roles() {
return $this->belongsToMany('App\User', 'role_users')->withTimestamps();
}
create_role_users_table迁移:
Schema::create('role_users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('role_id');
$table->unsignedBigInteger('user_id');
$table->timestamps();
});
RoleUsersFactory工厂:
$factory->define(RoleUser::class, function (Faker $faker) {
return [
'role_id' => Role::all()->random()->id,
'user_id' => User::all()->random()->id,];
});
RoleTableSeeder播种器:
$role_user = new Role();
$role_user->role = 'user';
$role_user->save();
$role_admin = new Role();
$role_admin->role = 'admin';
$role_admin->save();
DatabaseSeeder播种器:
$this->call(RoleTableSeeder::class);
factory(User::class, 5)->create()->each(function($user) {
$user->roles()->save(factory(RoleUser::class)->make());
});
答案 0 :(得分:0)
然后创建一个角色。
$role = Role::create(['role_name' => 'admin']);
使用attach()
factory(User::class, 100)->create()->each(function ($user) use ($role ) {
$role ->users()->attach($user);
});
尝试上面的代码。
这将创建100个具有admin角色的不同用户。 您可以添加其他类似的角色。
希望这套房子给您
答案 1 :(得分:0)
您的关系有误(您声明希望所有用户都具有一个角色,应该是BelongsTo / HasMany)。
在User
模型上,请使用以下方法:
public function role() {
return $this->belongsTo('App\Role');
}
在Role
模型上创建此方法:
public function users() {
return $this->hasMany('App\User');
}
删除在role_users
表创建位置所做的迁移,并使用以下代码创建新迁移:
Schema::table('users', function(Blueprint $table) {
// remove the nullable if a user HAS to have a role at all times
$table->unsignedBigInteger('role_id')->nullable();
}
现在,作为最后一步,播种机。您的角色寻找者是正确的。你不应该改变那个。将您的用户播种者更改为以下内容:
factory(User::class, 100)->create(['role_id' => Role::all()->random()->id]);
这将创建一个包含100个用户的数据库,其中每个用户都具有管理员或普通用户的角色。您可以使用$role->users
将所有用户附加到角色,并使用$user->role
获取用户的角色。