我想将子类别ID放入报价表中,但似乎太复杂了!这是我的尝试,显然它以循环结束。
这是播种机:
public function run()
{
factory(App\User::class, 50)->create()->each(function ($u) {
$u->quotes()->save(
factory(App\Quote::class)->make()
);
});
}
还有报价工厂:
return [
'text' => $faker->paragraph,
'author_id' => factory('App\Author')->create()->id,
'category_id' => factory('App\Category')->create()->id
];
类别工厂:
return [
'name' => $faker->text,
'parent_id' => factory('App\Category')->create()->id
];
答案 0 :(得分:2)
只要您使用的是Laravel> = 5.3,我建议您使用states。
对于您的默认类别工厂,请使用parent_id
= null
,例如
$factory->define(App\Category::class, function (Faker $faker) {
return [
'name' => $faker->text,
'parent_id' => null
];
});
然后,您可以添加状态工厂以包括父类别:
$factory->state(App\Category::class, 'child', function ($faker) {
return [
'parent_id' => factory('App\Category')->create()->id,
];
});
要使用状态,您只需要链接名为状态的名称为states()
的方法,例如
factory(App\Category::class)->states('child')->make();
如果您使用的是Laravel <= 5.2,那么我只建议保持parent_id
= null,然后再手动传递parent_id
,例如
$parent = factory(App\Quote::class)->create();
$u->quotes()->save(
factory(App\Quote::class)->make(['parent_id' => $parent->id])
);
我还建议将工厂内部的所有工厂电话都包装在一个封闭的容器中。
'parent_id' => function () {
return factory('App\Category')->create()->id;
}
这种方式只会在需要时创建模型。如果您曾经通过传递自己的ID来覆盖该值,则它实际上不会触发该函数,就好像它没有包装在闭包中一样,无论您是否传递ID来覆盖它,它都会调用工厂。 / p>
请查看documentation,以了解更多信息。