Laravel添加工厂自己的随机参考

时间:2019-07-09 12:42:19

标签: php laravel

我有一个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。

我知道如何在不使用工厂的情况下通过播种机手动创建它,但是如果可能的话,我想这样做吗?

1 个答案:

答案 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();