我会创建一个材料表来描述您的材料名称等。然后,我将有一个连接表,其中包含父材料 ID 的列和子材料 ID 的列以及所需的子材料的数量。
示例:材料 A 的 ID 为 1,材料 B 的 ID 为 2,材料 C 的 ID 为 3,材料 D 的 ID 为 4。如果您的材料 A 需要 1 部分材料 B 和 3 部分材料 C,则连接表中的条目会显示 [ 1(A 的 ID)、2(B 的 ID)、1(零件数)] 和 [1, 3, 3]。现在,假设材料 B 有 3 个部分 C 和 4 个部分 D,它将具有条目 [2 (B's id), 3 (c's id), 3 (parts)] 和 [2, 4 (d's id), 4 (部分)。将其拉出,您将从根 (A) 开始,向联接表询问所有具有父 ID = A 的 ID 的条目,然后对每个子材料 ID 执行相同的操作(向表询问所有条目子 id 作为父材料)等等。除非您指定某种最大深度,否则它必须是递归函数
潜在的问题是,如果你让材料 A 依赖于 B,而 B 依赖于 A,你将有无限递归。您必须进行一些严重的错误检查,以确保没有任何子项引用其树的更远的任何内容,因此它不会循环。创建这个错误检查可能是这个实现中最难的部分。
您的 select 语句将无法全部执行,因为 SQL(据我所知)并不真正支持递归,因此您可能希望创建一个参数化查询,例如“SELECT * FROM TheJoinTable WHERE parentId=?” 并一遍又一遍地运行它,直到返回的行数为 0。您还需要使此函数构建在嵌套数组上,然后您可以轻松地将其转换为页面的输出。
对于参数化查询,请查看 php 的 PDO 库。参数化查询也将解决许多 sql 注入问题,我认为这应该是一种普遍的做法。
我希望这不会太令人困惑...您的问题基本上是要求实现,我发现很难保持实现描述简短,当我尝试保持简短时,有时我最终会忘记提及某些内容。