В настоящее время я работаю с Laravel 5.8, и в моей базе данных есть таблица users
и таблица roles
, которые связаны многими со многими. Мое намерение состоит в том, чтобы заполнить всю базу данных за один раз, используя php artisan migrate:fresh --seed
, однако сводная таблица role_user
всегда пуста, что говорит о том, что с присоединением / синхронизацией что-то не так. Я намерен реализовать больше отношений «многие ко многим», поэтому я хочу полностью понять, как сеять эти отношения с помощью сеялок и фабрик.
Как я могу задать отношения «многие ко многим» и быстро проверить, правильно ли работают эти отношения?
Модель пользователя:
class User extends Authenticatable
{
//Default variables generated by Laravel
public function roles()
{
return $this->belongsToMany('App\Role', 'role_user')->withTimestamps();
}
}
Ролевая модель:
class Role extends Model
{
public function users()
{
return $this->belongsToMany('App\User', 'role_user')->withTimestamps();
}
}
Миграция таблицы role_user:
public function up()
{
Schema::create('role_user', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('role_id');
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->timestamps();
}
Role Seeder:
public function run()
{
$role_user = new Role();
$role_user->role = 'user';
$role_user->save();
$role_admin = new Role();
$role_admin->role = 'admin';
$role_admin->save();
}
User Seeder:
public function run()
{
$faker = Faker\Factory::create();
$role_user = Role::where('role','=','user')->first();
$role_admin = Role::where('role','=','admin')->first();
//Generic user account for testing
$test_user = new User();
$test_user->username = 'user';
$test_user->email = 'user@example.com';
$test_user->email_verified_at = now();
$test_user->password = 'user';
$test_user->remember_token = Str::random(10);
$test_user->save();
$test_user->roles()->attach($role_user);
//Generic admin account for testing
$test_admin = new User();
$test_admin->username = 'admin';
$test_admin->email = 'admin@example.com';
$test_admin->email_verified_at = now();
$test_admin->password = 'admin';
$test_admin->remember_token = Str::random(10);
$test_admin->save();
$test_admin->roles()->attach($role_admin);
}