2016-11-27 1 views
1

最近、モデルファクトリとFakerを使用してLaravelシードを使用してデータベースをシードしようとしています。不要なモデルを作成せずに、モデルファクトリ、1対1および1対多の関係でLaravel外部キーを定義する

シンプルなスキーマの場合、それを動作させるのは簡単です:)。しかし外部キーとテーブルの関係を伴う複雑なDBスキーマで作業する場合、私はいくつかの問題が発生した:

  • 一つ一つ
  • に1を多く
  • 多くに多くの

へ...リンクに記載されているように: Laravel 5.1 foreign keys in model factory。このトピックで

official documentationは、このようなデータベースの種を実行することを提案:

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

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

このような状況に対処するために、私は私のために機能し、それらの孤立したモデルの不必要な作成を避ける機能的なソリューションに出てきました...

そして私は誰とも共有したいので、答えは:)。

例が扱っ:だからここ

答えて

8

は私の解決策である

  • ユーザー&プロファイル
  • ユーザー(一対一のの関係を説明するための)&投稿(説明のために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... 
        ]; 
    }); 
    
+0

多くの関係?私はUser_Casesテーブルを持つユーザとケースを持っていて、多対多の問題を解決しています。私は、私のDBをシードするための工場を作成しようとしています。 – Kenilik

+1

私は、工場ではなくシーダーの中で**多対多**アプローチを取得します。シードャーでは、両方のモデル(*ユーザー*と*ケース*)を取得して、いずれの場合も、 – andcl

0

は、あなたがこのモデルに追加情報を送信する必要がある場合は特に、ランダムなユーザーを割り当てるよりもずっといいですな関係を作るためのソリューションです。

$factory->define(App\Post::class, function (Faker\Generator $faker) { 
    $user = factory('App\Models\User')->create(['email' => '[email protected],]); 
    // do your relationships here (...) 
    return [ 
     'user_id' => $user->id, 
     'title' => $faker->sentence, 
     'body' => $faker->paragraph, 
     ]; 
    } 

そして私は、匿名関数を使用して別の例を見て

$factory->define(App\Post::class, function (Faker\Generator $faker) { 
    return [ 
     'user_id' => function() { 
      return factory(App\User::class)->create()->id; 
     }, 
     'title' => $faker->sentence, 
     'body' => $faker->paragraph, 
    ]; 
} 

出典:私はあなたがに多くのために同じことを達成するための最良の方法を提案することができたとしていないhttps://laracasts.com/series/laravel-from-scratch-2017/episodes/22

関連する問題