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

Cri*_*ian 17 factory laravel laravel-seeding

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

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

我脑子里有三个选择:

  1. 从用户工厂创建,然后使用' - > each()'对鉴别器进行一些检查,并使用工厂创建新的业务用户.但是,我无法将user_id用户分配给业务工厂.
  2. 首先创建用户.然后在我的Business seeder中,检索所有匹配"业务"鉴别器的用户.然后,对于所有这些用户,运行一个创建业务详细信息的工厂.但同样,我必须以某种方式链接user_id已经创建的用户与业务工厂user_id.
  3. 在我的公司的工厂,创建一个新用户,并获取ID,从而使之间的联系users.user_idbusiness.user_id.但是我使用的是随机生成器,user.user_type即使我businesses填充了表,也可能是那些将鉴别器设置为"个人"的用户.

还有另外一种方法吗?我可以将Seeder的论据传递给工厂吗?

Jos*_*ber 65

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


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

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

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

根据您的需求进行调整.

  • 我怎么可能错过了。我看了 Laracast 课程,我知道我记得自己设置东西。当然,它也在文档中:http://laravel.com/docs/master/testing#model-factories。非常感谢。 (3认同)
  • @Cristian的链接现在看起来已过时,对于5.4,请参见https://laravel.com/docs/5.4/database-testing#using-factories并向下​​滚动至“持久模型” (2认同)

Rob*_*ood 8

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

// 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
        ])
    );
});
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

  • 你好罗宾,我如何在工厂内使用变量?不直接覆盖 (2认同)

Lak*_*lva 5

发送属性,

factory(App\User::class)->create(['businessId' => $businessId]);
Run Code Online (Sandbox Code Playgroud)

找回它,

$factory->define(App\User::class, function (Faker $faker, $businessInfo) {
    //$businessInfo['businessId']
});
Run Code Online (Sandbox Code Playgroud)