Как передать аргументы фабрикам Laravel?

У меня есть таблица users и отношение "один к нулю/один" с таблицей businesses (users.user_id = > business.user_id). В моей таблице users у меня есть дискриминатор, который говорит мне, является ли пользователь типом, и поэтому мне нужно иметь детали в таблице businesses.

Я хочу создать своих пользователей с моим factory, который в настоящее время работает, а затем создавать только бизнес-данные, где дискриминатор указывает на бизнес-аккаунт.

У меня есть три варианта:

  • Создайте из пользователей factory, а затем с помощью '- > each() выполните некоторые проверки на дискриминаторе и создайте нового бизнес-пользователя с помощью factory. Однако я не могу передать бизнес factory user_id, который был назначен пользователю.
  • Сначала создайте пользователей. Затем в моей сеялке "Бизнес" выберите всех пользователей, которые соответствуют "бизнес-дискриминатору". Затем для всех этих пользователей запустите factory, который создает данные о бизнесе. Но опять же, мне нужно связать каким-то образом user_id уже созданного пользователя с бизнес-интерфейсом factory user_id.
  • В моем бизнесе factory создайте нового пользователя и извлеките идентификатор, создав таким образом ссылку между users.user_id и business.user_id. Однако я использую случайный генератор для user.user_type, поэтому даже если у меня есть таблица businesses, заполненная, это может быть для пользователей, у которых дискриминатор как "личный".

Есть ли другой способ? Могу ли я передать аргументы из моего Seeder в factory?

Ответ 1

Атрибуты, которые вы передаете функции create, будут переданы в ваш обратный вызов определения модели в качестве второго аргумента.


В вашем случае вам даже не нужно обращаться к этим атрибутам, так как они будут автоматически объединены в:

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

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

Адаптируйте это к вашим потребностям.

Ответ 2

Мой код для добавления полиморфных пользователей 'Admin' был:

// 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
        ])
    );
});

Надеюсь это поможет.