Как заполнить вложенную таблицу категорий с помощью Faker в Laravel? - PullRequest
0 голосов
/ 24 августа 2018

Я хочу поместить идентификатор подкатегории в таблицу кавычек, но это кажется слишком сложным!Это моя попытка, очевидно, это закончилось циклом.

Вот сеялка:

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
];

1 Ответ

0 голосов
/ 24 августа 2018

Пока вы используете Laravel> = 5.3, я бы предложил использовать состояний .

Для вашей фабрики категории по умолчанию введите 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, тогда я бы просто предложил оставить значение <code>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;
}

Таким образом, модель будет создаваться только тогда, когда она нужна. Если вы когда-нибудь переопределите значение, передав свой собственный идентификатор, это на самом деле не вызовет функцию, где, как если бы оно не было заключено в замыкание, оно вызвало бы фабрику независимо от того, передали ли вы идентификатор, чтобы переопределить его.

Для получения дополнительной информации ознакомьтесь с документацией .

...