【问题标题】:Laravel adding factory own random referenceLaravel 添加工厂自己的随机引用
【发布时间】:2019-11-19 00:39:44
【问题描述】:

我有一个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()]
);

这里的 Seeder 只选择一个随机元素,所有后续子类别都(例如)引用类别 ID 15。

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

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    您可以使用此处所示的 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();
    

    【讨论】:

    • 当然可以,但是这样定义会导致我无法创建父类别?我将如何生成前 50 个父类别为 null 的父类别?
    • 使用工厂状态更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2022-11-29
    • 2022-11-27
    • 2019-01-08
    • 2018-09-14
    相关资源
    最近更新 更多