【问题标题】:How to populate a nested category table with Faker in Laravel?如何在 Laravel 中使用 Faker 填充嵌套类别表?
【发布时间】:2019-01-31 05:05:44
【问题描述】:

我想将子类别 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?
  • @dwjohnston 我想这是一个无限循环。

标签: laravel laravel-5 model faker laravel-seeding


【解决方案1】:

只要你使用 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 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 了解更多信息。

【讨论】:

  • 感谢您添加有关关闭的信息,非常有用!
猜你喜欢
  • 2021-06-30
  • 2016-03-31
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 2014-10-31
  • 1970-01-01
相关资源
最近更新 更多