laravel - 如何在 Laravel 中使用 Faker 填充嵌套类别表?

标签 laravel laravel-5 model faker laravel-seeding

我想将子类别 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
];

最佳答案

只要你使用 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 来覆盖它,它都会调用工厂。

看看 documentation了解更多信息。

关于laravel - 如何在 Laravel 中使用 Faker 填充嵌套类别表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52009164/

相关文章:

php - Laravel FFMPEG 中的条件格式

ios - 存储日期组件而不是日期

asp.net-mvc-3 - 我需要双向创建 automapper createmap 吗?

laravel - 如何跳过另一个中间件的所有中间件?

php - 根据 laravel 中的条件显示一个部分

Laravel Mix 和 SASS 更改字体目录

php - 在 Eloquent 模型上还有另一种方法 "setConnection"吗?

php - Laravel 5 并发请求和预定作业

php - 如何在 Laravel 5.1 中为作业创建子目录?

ruby-on-rails - Rails 4 Paypal REST API 集成