为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
偶然的你 2021-05-08 16:18:35
我有一个选择菜单,用户可以在其中选择特定功能,并根据他们选择的内容显示一个带有新选项的新选择菜单。根据他们选择的内容,此过程可以重复几次。例如,如果选择菜单显示以下项目: 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在同一个表。因此,例如,Red当用户选择任何选项时,带有名称的第四行是可见的Apple, Mango, Orange.同样,如果他们不能选择第一个选项和第二个选项,则不能选择Bad第三个选项。MangoRed将;用于包括其他选项对也是如此。我希望这是有道理的。这是我的表结构。在代码中,我将其作为数组:$color = [    'Apple'  => [        'Red',        'Green',    ],    'Mange'  => [        'Red',        'Green',    ],    'Orange' => [        'Red',        'Orange',    ],];$taste = [    'Red' => [        'Slicy'    ],    // so on...];我认为这不是最好的方法。特别是如果以后要添加更多内容,则必须大量修改数据,这可能会很麻烦。如何解决此问题?
查看完整描述

1 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

既然您想拥有尽可能深入的自由,那么以下解决方案可能会起作用:


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 1response的所有子级[2, 3]

  3. 填写新的选择输入。

  4. 用户选择第二个功能id 2

  5. 正在进行API调用,并返回id 2response的所有子级[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作为父级和Apple具有Red作为父级的对象。是TastCake


查看完整回答
反对 回复 2021-05-28
  • 1 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信