#laravel #recursion #laravel-5.1 #factory #laravel-seeding
#laravel #рекурсия #laravel-5.1 #фабрика #laravel-заполнение
Вопрос:
В моем проекте Laravel DB есть рекурсивная таблица, которая обрабатывает динамическое меню. В целях тестирования я хочу заполнить эту таблицу случайными элементами.
Случайный элемент faker
библиотеки подойдет для названия меню. Проблема в том, как сгенерировать числа parent_id, которые соответствуют любому элементу этой таблицы меню. Я покажу вам пример:
---------------------------
| id | name | parent_id |
---------------------------
| 1 | animals | 0 |
|---------------------------|
| 2 | food | 0 |
|---------------------------|
| 3 | dog | 1 |
|---------------------------|
| 4 | potato | 2 |
|---------------------------|
| 5 | monkey | 1 |
---------------------------
Случайное число здесь не будет работать, потому что некоторые записи таблицы не будут иметь никакого связанного родительского элемента. И поскольку идентификатор является инкрементным, идентификатор будет меняться в любое время. Parent_id должен быть связан с некоторым идентификатором.
Я создал фабрику для первого уровня (the parent_id = 0
). Но я не знаю, как продолжить сейчас.
$factory->defineAs(AppSection::class, 'firstLevelMenu', function($faker) {
return [
'name' => $faker->unique->randomElement([
'animals',
'food'
]),
'parent_id' => '0'
];
});
Комментарии:
1. Я думаю, вы могли бы сделать что-то вроде этого:
'parent_id' => collect([0])->merge(AppSection::lists('id'))->random()
2. @Ohgod Почему я это попробовал (я не знал
lists
, что это красноречивый метод!). Это почти работает, за исключением ‘0’. В некоторых случаяхparent_id
равно 0, и я этого не хочу. Есть ли какой-либо способ избежать ‘0’? Если у вас есть ответ, просто опубликуйте его, я все равно буду считать его действительным, это решило мою проблему.3. При каких обстоятельствах вы хотели бы игнорировать
0
?4. @Ohgod Почему элементы меню первого уровня
parent_id
имеют значение 0. И я бы использовал для этого функцию enclosure из примера. Затем вторая / третья / четвертая… элементы меню уровня должны содержать любое другоеid
количество таблиц в качествеparent_id
элементов, кроме 0. Потому что их нет в меню первого уровня.5. Я думаю, вы могли бы выполнить это с помощью троичного.
'parent_id' = > AppSection::all()->count() > 2 ? AppSection::lists('id')->random() : 0