Laravel - Проблемы с хранением динамических опций в базе данных? - PullRequest
1 голос
/ 06 мая 2019

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

Например, если в меню выбора отображаются следующие пункты: apple, mango, orange.

И пользователь выбирает apple: они получаттри дополнительных параметра, которые относятся к яблоку - brown, red, green. Если пользователь, например, выберет orange, он может увидеть red, orange. Обратите внимание, что красный цвет появляется дважды.

Моя главная проблема - найти хороший способотследить его.

Мое текущее решение

У меня есть две таблицы - features и feature_group.

feature_group имеет столбцы: id, name features имеет столбцы: id, group_id, name, links

Если мы вернемся к предыдущему примеру,

В настоящее время я сохраняю параметрыв разделе links.

feature_group таблица:

| id | name   |
|----|--------|
| 1  | Fruit  |
| 2  | Colour |
| 3  | Taste  |

features таблица:

| id | group_id | name   | links     |
|----|----------|--------|-----------|
| 1  | 1        | Apple  |           |
| 2  | 1        | Mango  |           |
| 3  | 1        | Orange |           |
| 4  | 2        | Red    | 1,2,3     |
| 5  | 2        | Green  | 1,2       |
| 6  | 2        | Orange | 3         |
| 7  | 3        | Slicy  | 1,2;1,2,3 |
| 8  | 3        | Okay   | 1,2,3,4   |
| 9  | 3        | Bad    | 2,4       |

Как видите, столбец links содержит id из features в той же таблице .Так, например, 4-я строка с именем Red отображается, когда пользователь выбирает любой из параметров Apple, Mango, Orange.

Аналогично, если он не может выбрать Bad в качестве третьего параметра, если он выбрал что-либокроме Mango для первой опции и Red для второй опции.

; также используется для включения других пар опций.

Надеюсь, это имеет смысл.

Это моя структура таблицы.В коде я делаю это как массив:

$color = [
    'Apple'  => [
        'Red',
        'Green',
    ],
    'Mange'  => [
        'Red',
        'Green',
    ],
    'Orange' => [
        'Red',
        'Orange',
    ],
];

$taste = [
    'Red' => [
        'Slicy'
    ],
    // so on...
];

Я не думаю, что это лучший способ сделать это.Особенно, если я захочу добавить еще что-нибудь позже, мне придется много модифицировать свои данные, что может быть хлопотно.

Как можно решить эту проблему?

1 Ответ

1 голос
/ 06 мая 2019

Так как вы хотите иметь свободу как можно глубже, может сработать следующее решение:

Table: features

| id | name  |
|----|-------|
| 1  | Apple |
| 2  | Red   |
| 3  | Green |
| 4  | Sweet |
| 5  | Sour  |
| 6  | Cake  |
| 7  | Cider |

Table: feature_parent_child // maybe you have a better name

| parent_id | child_id |
|-----------|----------|
| 1         | 2        |
| 1         | 3        |
| 2         | 4        |
| 3         | 5        |
| 4         | 6        |
| 5         | 7        |

Если мы будем следовать нашим отношениям, мы можем получить:

Apple -> Red -> Sweet -> Cake -> ...
Apple -> Green -> Sour -> Cider -> ...

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

Cake -> Sugar -> Sweet -> Apple
Cider -> Party -> Happy -> Cake -> Birthday

Сложность заключается в управлении количеством функций.

Обновление после комментария

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

В качестве первого мы можем вернуть всех потомков данной функции:

  1. Пользователь выбирает первую функцию id 1.
  2. Выполняется вызов API и возвращаются все дочерние элементы id 1, ответ [2, 3].
  3. Заполнить новый выбор ввода.
  4. Пользователь выбирает вторую функцию id 2.
  5. Вызов API выполняется и возвращает всех потомков id 2, ответ [4].
  6. ...

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

* * Пример тысяча сорок-одиной: * +1042 *
Apple -> Red
Apple -> Green

Red -> Apple -> Tasty
Red -> Apple -> Cake

Мы видим, что Apple имеет две дочерние функции Red и Green. Однако, как только мы имеем Red в качестве родителя, мы можем видеть, что Apple имеет две различные функции, Tasty и Cake. Необходимо выполнить следующую процедуру.

  1. Пользователь выбирает первую функцию Red.
  2. Получить все функции, которые имеют Red в качестве родителя. В данном примере это Apple.
  3. Пользователь выбирает Apple.
  4. Получите все, у которых Apple является родителем, а Apple имеет Red как родителя. Которые Tast и Cake.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...