Laravel 在多对多关系中植入错误的 id 值

Laravel seeds wrong id values in many to many relations

我目前学习 Laravel 5.8 并创建了数据库,其中 users 可以有两个角色:adminuser 存储在 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.

获取用户的角色