web-dev-qa-db-ja.com

Laravel工場に引数を渡す方法は?

usersテーブルとbusinessesテーブルとの1対0または1の関係があります(users.user_id => businesss.user_id)。私のusersテーブルには、ユーザーのタイプがビジネスかどうかを示す弁別子があり、そのためbusinessesテーブルの詳細も必要です。

現在機能している私の工場でユーザーを作成し、その後、弁別担当者がビジネスアカウントを指すビジネスの詳細のみを作成したいと考えています。

私には3つの選択肢があります。

  1. ユーザーファクトリから作成し、次に '-> each()'を使用して識別子をチェックし、ファクトリを使用して新しいビジネスユーザーを作成します。しかし、ユーザーが割り当てられたuser_idをビジネスファクトリーに渡すことはできません。
  2. 最初にユーザーを作成します。次に、私のビジネスシーダーで、「ビジネス」識別子に一致するすべてのユーザーを取得します。次に、これらすべてのユーザーに対して、ビジネスの詳細を作成するファクトリを実行します。しかし、繰り返しますが、すでに作成したユーザーのuser_idをビジネスファクトリuser_idにリンクする必要があります。
  3. 私のビジネスファクトリで、新しいユーザーを作成してIDを取得し、users.user_idbusiness.user_idの間のリンクを作成します。しかし、私はuser.user_typeにランダムジェネレーターを使用しているので、businessesテーブルに入力しても、弁別子が「個人」であるユーザー向けである可能性があります。

別の方法はありますか? Seederから工場に引数を渡すことはできますか?

23
Cristian

create関数に渡す属性は、2番目の引数としてモデル定義コールバックに渡されます。


あなたの場合、それらは自動的にマージされるので、これらの属性にアクセスする必要さえありません:

$business = factory(App\Business::class)->create();

factory(App\User::class, 5)->create([
    'business_id' => $business->id,
]);

これをあなたのニーズに合わせてください。

76
Joseph Silber

ポリモーフィックな「管理者」ユーザーを追加するための私のコードは次のとおりです。

// run model factory
factory(App\Admin::class, 3)->create()->each(function ($admin) {

    $admin->user()->save(

        // solved: https://laravel.com/docs/master/database-testing#using-factories (Overriding attributes)
        factory(App\User::class)->make([
              'userable_id' => $admin->id,
              'userable_type' => App\Admin::class
        ])
    );
});

お役に立てれば。

4
Robin Hood