Laravel отбрасывает неправильные значения id во многих отношениях - PullRequest
0 голосов
/ 11 апреля 2019

В настоящее время я изучаю Laravel 5.8 и создал базу данных, в которой users может иметь две роли: admin или user, хранящиеся в таблице roles.Я пытался заполнить промежуточную таблицу role_users, но Laravel удваивает строки и отбрасывает неверные данные, например: Сумасшедшая таблица ROLE_USER .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:

$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 голосов
/ 11 апреля 2019

У вас неправильные отношения (вы заявляете, что хотите, чтобы у всех пользователей была одна роль, которая должна быть 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();
}

Теперь, как последний шаг, сеялки.Ваш Role-seeder правильный.Вы не должны это менять.Измените User-seeder на следующее:

factory(User::class, 100)->create(['role_id' => Role::all()->random()->id]);

Это создаст базу данных на 100 пользователей, каждый из которых имеет роль администратора или обычного пользователя.Вы можете привязать всех пользователей к роли с помощью $role->users и получить роль пользователя с помощью $user->role.

0 голосов
/ 11 апреля 2019

затем создайте роль.

$role = Role::create(['role_name' => 'admin']);

используйте attach()

factory(User::class, 100)->create()->each(function ($user) use ($role ) {
        $role ->users()->attach($user);
});

Попробуйте приведенный выше код.

Это создаст 100 различных пользователей с правами администратора.роль.Вы можете добавить другие роли, подобные этой.

надеюсь, что этот пакет для вас.

...