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