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

标签 php mysql database laravel

我有一个选择菜单,用户可以在其中选择特定功能,并且根据他们的选择,会显示一个包含新选项的新选择菜单。根据他们的选择,这个过程可以重复多次。

例如,如果选择菜单显示这些项目:apple、mango、orange。

然后用户选择 apple:他们将获得三个与苹果相关的附加选项 - brown、red、green。 如果用户选择 orange 例如,他们可能会看到 红色、橙色。 请注意,红色出现了两次。

我的主要问题是找到一种追踪它的好方法。

我目前的解决方案

我有两个表 - featuresfeature_group。

feature_group 包含列:idname features 包含列:idgroup_idnamelinks

如果我们回到前面的例子,

我目前将选项存储在 links 部分。

feature_group表:

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

特征表:

| 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 列包含same 表中featuresid。因此,例如,当用户选择任何选项 Apple、Mango、Orange 时,名称为 Red 的第 4 行是可见的。

同样,如果他们不能选择 Bad 作为第三个选项,如果他们为第一个选项选择了 MangoRed 以外的任何选项第二个选项。

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

我希望这是有道理的。

这是我的表结构。在代码中,我将它作为一个数组来做:

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

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

我认为这不是最好的方法。特别是如果我以后想添加更多的东西,那么我必须修改我的数据很多,这会很麻烦。

如何解决这个问题?

最佳答案

由于您想自由地尽可能深入,因此可以使用以下解决方案:

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

我认为,如果我弄错了,请原谅,也可以根据其先前的 parent 为每个特征赋予不同的 child 。然而,这需要更多的逻辑。

例子:

Apple -> Red
Apple -> Green

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

我们可以看到 Apple 有两个子特征 RedGreen。然而,一旦我们将 Red 作为父级,我们就可以看到 Apple 有两个不同的功能,TastyCake。需要执行以下程序。

  1. 用户选择第一个特征红色
  2. 获取所有以 Red 为父级的特征。在给定的示例中是 Apple
  3. 用户选择 Apple
  4. 获取所有以 Apple 为父级且 AppleRed 为父级的对象。分别是 TastCake

关于php - Laravel - 在数据库中存储动态选项的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55997340/

相关文章:

php - 如何在 htaccess 中设置 mod_rewrite?

php - javascript将函数的数据作为文件返回

php - 使用复选框从 mysql 中删除多行

database - 可以在 heroku postgresql 中删除一行吗?

javascript - 产品页面上的数量发生变化时自动更新价格 Magento

php - 使用 Javascript 将值插入多个隐藏字段,每个字段都以不同的形式

mysql - C++ 中的 MySQL ping 命令是否阻塞

c# - 获取更新查询的 sql 语法错误

java - SWING 中哪个数据存储可以处理 TB 级的音频调用

mysql - 3 表加减法