17

最近、Model Factory と Faker を介して Laravel シードを使用してデータベースにシードしようとしています。

単純なスキーマの場合、それを機能させるのは簡単です:)。ただし、外部キーとテーブルの関係を含む複雑な DB スキーマを操作するときに、いくつかの問題に遭遇しました。

  • 一対一
  • 一対多
  • 多対多

...リンクで説明されているもののように: Laravel 5.1foreign keys in model factory

このトピックでは、公式ドキュメントは次のようにデータベース シードを実行することを提案しています。

public function run()
{
    factory(App\User::class, 50)->create()->each(function ($u) {
        $u->posts()->save(factory(App\Post::class)->make());
    });
}

... しかし、このソリューションには 1 つの問題があります。多くの DB テーブルを操作し、多くのシード (それらの間に多くの関係がある) を実行する場合、この方法論を使用して多くの不要なモデルを作成するのが一般的です。たとえば、上記の例の前に PostsTableSeeder.php を実行した場合、それらの投稿はすべてユーザーにリンクされず、テストや開発で使用されることはありません...

この状況を処理する方法を探して、私は自分に合った機能的なソリューションを思いつき、それらの「孤立した」モデルの不必要な作成を回避しました...

そして、私はそれをみんなと共有したかったので、答えで説明しただけです:)。

4

2 に答える 2

39

だからここに私の解決策があります:

この例では以下を扱います。

  • ユーザーとプロファイル( 1 対 1 の関係を示すため)
  • ユーザーと投稿( 1 対多の関係を示すため)

    // ONE TO ONE relationship (with Users already created)
    $factory->define(App\Profile::class, function (Faker\Generator $faker) {
        return [
            'user_id' => $faker->unique()->numberBetween(1, App\User::count()),
            // Rest of attributes...
        ];
    });
    
    // ONE TO MANY relationship (with Users already created)
    $factory->define(App\Posts::class, function (Faker\Generator $faker) {
        $users = App\User::pluck('id')->toArray();
        return [
            'user_id' => $faker->randomElement($users),
            // Rest of attributes...
        ];
    });
    
于 2016-11-27T12:48:05.270 に答える