Создание рекурсивной таблицы с использованием фабрик в Laravel

#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