如何将参数传递给Laravel工厂?

时间:2015-09-03 14:19:23

标签: laravel factory laravel-seeding

我有一个users表和一个与businesses表(users.user_id => enterprises.user_id)的一对一/一关系。在我的users表上,我有一个鉴别器,它告诉我用户是否属于业务类型,因此我需要在businesses表上有详细信息。

我想用我当前正在工作的工厂创建我的用户,然后只创建商业详细信息,其中鉴别器指向商业帐户。

我脑子里有三个选择:

  1. 从用户工厂创建,然后使用' - >每个()'对鉴别器进行一些检查,并使用工厂创建新的业务用户。但是,我无法将分配给用户的user_id传递给业务工厂。
  2. 首先创建用户。然后在我的商家播种机中,检索所有符合“商家”的用户。鉴别。然后,对于所有这些用户,运行一个创建业务详细信息的工厂。但同样,我必须以某种方式将已创建用户的user_id链接到业务工厂user_id
  3. 在我的商家工厂中,创建一个新用户并检索ID,从而在users.user_idbusiness.user_id之间建立链接。但是我使用user.user_type的随机生成器,所以即使我填充了businesses表,也可能是那些将鉴别器作为“个人”的用户。
  4. 还有其他方法吗?我可以将Seeder的论据传递给工厂吗?

2 个答案:

答案 0 :(得分:53)

传递给create函数的属性将作为第二个参数传递给模型定义回调。

在您的情况下,您甚至不需要访问这些属性,因为它们会自动合并:

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

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

根据您的需要进行调整。

答案 1 :(得分:0)

我添加多态“管理员”用户的代码是:

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

希望这会有所帮助。