web-dev-qa-db-ja.com

Laravel-多対多の関係のシード

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テーブルにデータを入力するにはどうすればよいですか? (ジャンクションテーブルのモデルファイルがありません。)

私はこれに非常に新しいので、どんな助けでもありがたいです。ありがとう。

14
Bilal Khawar

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()
    ); 
});
34
peterm

別の方法は、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);
   });
}
7
user1853220

播種機だけで、次のようなものを使用できます。

   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);
3
Oleg