Laravel-在数据库中存储动态选项有问题吗?

时间:2019-05-05 23:45:43

标签: php mysql database laravel

我有一个选择菜单,用户可以在其中选择特定功能,然后根据他们选择的内容,出现一个带有新选项的新选择菜单。根据选择的内容,该过程可以重复多次。

例如,如果选择菜单显示以下项目:apple, mango, orange.

然后用户选择apple:他们将获得与苹果相关的三个附加选项– brown, red, green.例如,如果用户选择orange,他们可能会看到{{1} }请注意,红色显示两次。

我的主要问题是有一个很好的追踪方法。

我当前的解决方案

我有两个表-red, orange.features

feature_group.的列:feature_groupid name的列:featuresidgroup_idname

如果我们回到上一个示例,

我当前将这些选项存储在links部分中。

links 表:

feature_group

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

features

如您所见,在{strong>相同表中,| 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

时,名称为Red的第四行就可见

同样,如果他们没有选择Apple, Mango, Orange.作为第一个选项,而选择了Bad作为第二个选项,则他们不能选择Mango作为第三选项。

Red也用于包含其他选项对。

我希望这是有道理的。

这是我的表结构。在代码中,我将其作为数组:

;

我认为这不是最好的方法。尤其是如果以后要添加更多内容,那么我必须对数据进行大量修改,这可能会很麻烦。

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

由于您想拥有尽可能深入的自由,因此以下解决方案可能会起作用:

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. ...

我认为,如果我误会了,请原谅,也有可能让每个功能都由不同的孩子来照顾前任父母。但是,这需要更多的逻辑。

示例:

Apple -> Red
Apple -> Green

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

我们可以看到Apple有两个子功能RedGreen。但是,一旦我们以Red为父母,我们就会发现Apple具有两个不同的功能,TastyCake。需要执行以下过程。

  1. 用户选择第一个功能Red
  2. 获取所有以Red为父级的特征。在给定示例中为Apple
  3. 用户选择Apple
  4. 获取所有以Apple为父,所有AppleRed为父的事物。分别是TastCake
相关问题