Laravel 在多对多关系中植入错误的 id 值
Laravel seeds wrong id values in many to many relations
我目前学习 Laravel 5.8 并创建了数据库,其中 users
可以有两个角色:admin
或 user
存储在 roles
table .我试图填充 role_users
中间 table 但 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());
});
然后创建一个角色。
$role = Role::create(['role_name' => 'admin']);
使用attach()
factory(User::class, 100)->create()->each(function ($user) use ($role ) {
$role ->users()->attach($user);
});
试试上面的代码。
这将创建 100 个具有管理员角色的不同用户。
您可以像这样添加其他角色。
希望这套适合你。
你的关系有误(你声明你希望所有用户都有一个角色,应该是 BelongsTo / HasMany)。
在User
模型上,有这个方法:
public function role() {
return $this->belongsTo('App\Role');
}
在 Role
模型上创建此方法:
public function users() {
return $this->hasMany('App\User');
}
删除您在创建 role_users
table 的地方创建的迁移,并使用以下代码创建新的迁移:
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();
}
现在,作为最后一步,播种机。您的角色播种机是正确的。你不应该改变它。将您的 User-seeder 更改为以下内容:
factory(User::class, 100)->create(['role_id' => Role::all()->random()->id]);
这将创建一个包含 100 个用户的数据库,其中每个用户都具有管理员或普通用户的角色。您可以使用 $role->users
获取附加到角色的所有用户,并使用 $user->role
.
获取用户的角色
我目前学习 Laravel 5.8 并创建了数据库,其中 users
可以有两个角色:admin
或 user
存储在 roles
table .我试图填充 role_users
中间 table 但 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());
});
然后创建一个角色。
$role = Role::create(['role_name' => 'admin']);
使用attach()
factory(User::class, 100)->create()->each(function ($user) use ($role ) {
$role ->users()->attach($user);
});
试试上面的代码。
这将创建 100 个具有管理员角色的不同用户。 您可以像这样添加其他角色。
希望这套适合你。
你的关系有误(你声明你希望所有用户都有一个角色,应该是 BelongsTo / HasMany)。
在User
模型上,有这个方法:
public function role() {
return $this->belongsTo('App\Role');
}
在 Role
模型上创建此方法:
public function users() {
return $this->hasMany('App\User');
}
删除您在创建 role_users
table 的地方创建的迁移,并使用以下代码创建新的迁移:
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();
}
现在,作为最后一步,播种机。您的角色播种机是正确的。你不应该改变它。将您的 User-seeder 更改为以下内容:
factory(User::class, 100)->create(['role_id' => Role::all()->random()->id]);
这将创建一个包含 100 个用户的数据库,其中每个用户都具有管理员或普通用户的角色。您可以使用 $role->users
获取附加到角色的所有用户,并使用 $user->role
.