我有一个categories
表,该表具有一个parent_id
属性,该属性应指向父类别。顶级类别的parent_id
设置为null
。
是否可以通过工厂播种数据库,以使一部分成为父类别,而其他部分则随机指向父类别?
工厂:
$factory->define(Category::class, function (Faker $faker) {
return [
'name' => $faker->name,
];
});
播种机(不工作):
factory(Category::class, 50)->create();
factory(Category::class, 450)->create(
['parent_id' => Category::all()->pluck('id')->random()]
);
播种者在这里仅选择一个随机元素,并且所有后续子类别(例如)都引用类别ID15。
我知道如何在不使用工厂的情况下通过播种机手动创建它,但是如果可能的话,我想这样做吗?
答案 0 :(得分:2)
您可以使用Seeder状态实现功能,如下所示。
$factory->define(Category::class, function (Faker $faker) {
return [
'name' => $faker->name,
'parent_id' => Category::inRandomOrder()->take(1)->first()->id,
];
});
$factory->state(Category::class, 'withParent', function (Faker\Generator $faker){
return [
'parent_id' => Category::inRandomOrder()->take(1)->first()->id,
];
});
随机优化类别,以免每次都获取。不能100%地确定这是正确的调用过程,但是您应该了解一下。
调用父级时的语法是
factory(Category::class, 5)->create();
如果您希望与父母一起进行分类,则可以应用状态并将其添加到种子中。
factory(Category::class, 5)->states('withParent')->create();