Laravel добавляет фабрику собственную случайную ссылку - PullRequest
0 голосов
/ 09 июля 2019

У меня есть таблица 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()]
);

Сеялка здесь выбирает только один случайный элемент, и все последующие дочерние категории имеют (например)ссылка на ID категории 15.

Я знаю, как создать его вручную с помощью сеялок, не используя фабрики, но я хотел бы сделать это следующим образом, если это возможно?

1 Ответ

2 голосов
/ 09 июля 2019

Вы можете достичь своей функциональности, используя состояния сеялки, как показано здесь.

$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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...