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

时间:2019-04-11 10:55:30

标签: php laravel laravel-5 eloquent laravel-5.8

我目前学习Laravel 5.8,并创建了一个数据库,其中users可以扮演两个角色:存储在admin表中的userroles。我试图填充role_users中间表,但是Laravel将行加倍并植入了错误的数据,例如:Crazy ROLE_USER Tablerole_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());   
});

2 个答案:

答案 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获取用户的角色。