如何向Laravel工厂传递参数?

55
我有一个名为users的表格和一个与businesses表格的一对零/一关系(users.user_id => businesses.user_id)。在我的users表格中,我有一个鉴别器,告诉我用户是否是商业类型,因此我还需要在businesses表格中有详细信息。
我想用我的工厂创建用户,目前它正在工作,然后只创建鉴别器指向商业账户的商业细节。
我脑海中有三个选项:
1.从用户工厂创建,然后使用'->each()'对鉴别器进行一些检查,并使用工厂创建新的商业用户。但是我无法传递已分配给用户的user_id到商业工厂。
2.首先创建用户。然后在我的Business种子中,检索所有匹配“business”鉴别器的用户。然后对于所有这些用户运行一个创建商业细节的工厂。但是,我必须以某种方式链接已创建用户的user_id与商业工厂user_id
3.在我的business工厂中,创建一个新用户并检索id,从而建立users.user_idbusiness.user_id之间的链接。但是我正在使用一个随机生成器来生成user.user_type,因此即使我填写了businesses表格,它也可能适用于具有“个人”鉴别器的用户。
还有其他方法吗?我能从我的种子传递参数到工厂吗?
3个回答

109

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


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

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

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

根据您的需求进行调整。


3
我怎么会错过那个。我看了Laracast的课程,现在我记得如何自己设置东西。当然文档中也有:http://laravel.com/docs/master/testing#model-factories。非常感谢。 - Cristian
4
@Cristian提供的链接现在已经过时,如果要查看5.4版本的内容,请访问https://laravel.com/docs/5.4/database-testing#using-factories并向下滚动到“持久化模型”部分。 - Harry
1
像这样怎么样?$student->assignRole('student');我正在使用 spatie/permission。 - Lloric Mayuga Garcia
1
@shotex - 如果你想要自定义参数,为什么要使用工厂呢?直接自己创建模型:User::create($attributes) - Joseph Silber
1
太好了,手册上是这样说的:您可以通过将数组传递给create方法来覆盖模型上的属性。 - PaulH
显示剩余2条评论

10

我添加多态“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
        ])
    );
});
希望这有所帮助。

Hope this helps.

翻译为:

希望这有所帮助。


2
你好 Robin,我如何在工厂内使用变量?而不是直接覆盖它。 - George
然后你需要使用 Admin 类:$admin = new Admin()。从那里开始,看看会发生什么。 - Robin Hood
在用户工厂中有没有一种方法可以访问$admin->id? - vikrant
make似乎没有保存记录,顺便提一下。 - mikoop
1
谢谢,这很棒,对我的种子有所帮助。 - mikoop
显示剩余3条评论

4

发送属性,

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

检索它,

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接