【问题标题】:How to pass arguments to Laravel factories?如何将参数传递给 Laravel 工厂?
【发布时间】:2015-11-29 10:35:04
【问题描述】:

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

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

我有三个选择:

  1. 从用户工厂创建,然后使用“->each()”对鉴别器进行一些检查,并使用工厂创建新的业务用户。但是,我无法将分配给用户的user_id 传递给业务工厂。
  2. 首先创建用户。然后在我的业务播种器中,检索与“业务”鉴别器匹配的所有用户。然后为所有这些用户运行一个创建业务细节的工厂。但同样,我必须以某种方式将已创建用户的user_id 与业务工厂user_id 链接起来。
  3. 在我的业务工厂中,创建一个新用户并检索 id,从而在users.user_idbusiness.user_id 之间建立链接。但是,我正在为user.user_type 使用随机生成器,所以即使我填写了businesses 表,它也可能适用于将鉴别器设为“个人”的用户。

还有其他方法吗?我可以将 Seeder 中的参数传递给工厂吗?

【问题讨论】:

    标签: laravel factory laravel-seeding


    【解决方案1】:

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


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

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

    根据您的需要进行调整。

    【讨论】:

    【解决方案2】:

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

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

    希望这会有所帮助。

    【讨论】:

    • 你好 Robin 我如何在工厂内使用变量?不直接覆盖
    • @George 然后只需使用 make() 而不使用 userable_iduserable_type 的自定义值数组。
    • 我希望 admin 变量在用户工厂中可用,例如 if( $admin->name == 'test'} do something
    • 那么你需要使用Admin类:$admin = new Admin()。 ? 从那里开始,看看它的发展方向。
    • 谢谢,这很好,对我的种子有帮助
    【解决方案3】:

    发送属性,

    factory(App\User::class)->create(['businessId' => $businessId]);
    

    取回它,

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

    【讨论】:

      猜你喜欢
      • 2021-07-11
      • 2023-03-06
      • 1970-01-01
      • 2012-08-29
      • 2017-07-30
      • 2021-03-03
      • 2018-08-01
      • 2015-04-13
      • 1970-01-01
      相关资源
      最近更新 更多