users
テーブルとroles
多対多の関係を持つテーブル。これらの2つのテーブルは、role_user
というジャンクションテーブルに接続されています。
以下は私のLaravelプロジェクトのモデルです。
ユーザー
namespace App;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
public function roles()
{
return $this->belongsToMany('App\Role');
}
}
ロール
namespace App;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
public function users()
{
return $this->belongsToMany('App\User');
}
}
以下は、LaravelプロジェクトのFactoryファイルです。
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'password' => $password ?: $password = bcrypt('secret'),
];
});
$factory->define(App\Role::class, function (Faker\Generator $faker) {
return [
'role' => $faker->realText($maxNbChars = 2),
'description' => $faker->realText($maxNbChars = 20),
];
});
以下は、SeedプロジェクトのLaravelファイルです。
public function run()
{
factory(App\User::class, 50)->create()->each(function ($u) {
$u->roles()->save(factory(App\Role::class)->make());
});
factory(App\Role::class, 20)->create()->each(function ($u) {
$u->users()->save(factory(App\User::class)->make());
});
}
これにより、users
テーブルとroles
テーブルですが、role_user
テーブルにデータを入力するにはどうすればよいですか? (ジャンクションテーブルのモデルファイルがありません。)
私はこれに非常に新しいので、どんな助けでもありがたいです。ありがとう。
attach()
またはsync()
method を多対多の関係で使用できます。
これにアプローチする方法は複数あります。ここにそれらの1つ:
// Populate roles
factory(App\Role::class, 20)->create();
// Populate users
factory(App\User::class, 50)->create();
// Get all the roles attaching up to 3 random roles to each user
$roles = App\Role::all();
// Populate the pivot table
App\User::all()->each(function ($user) use ($roles) {
$user->roles()->attach(
$roles->random(Rand(1, 3))->pluck('id')->toArray()
);
});
別の方法は、saveMany()関数を使用することです
public function run()
{
factory(App\User::class,3)->create();
$roles = factory(App\Role::class,3)->create();
App\User::All()->each(function ($user) use ($roles){
$user->roles()->saveMany($roles);
});
}
播種機だけで、次のようなものを使用できます。
for ($i = 0; $i < 50; $i++) {
$user = factory(App\User::class)->create();
$role = factory(App\Role::class)->create();
DB::table('role_user')->insert([
'user_id' => $user->id,
'role_id' => $role->id
]);
}
しかし、通常、多くのスルーがあるような関係を定義する必要があります https://laravel.com/docs/5.4/eloquent-relationships#has-many-through
その後、使用できるようになります:
$user->roles()->save($role);