あなたの材料の名前などを説明する材料表を作成します。次に、必要な子マテリアルの量とともに、親マテリアル ID の列と子マテリアル ID の列を持つ結合テーブルを作成します。
例: マテリアル A の ID は 1、マテリアル B は id 2、マテリアル C は id 3、マテリアル D は 4 です。マテリアル A が 1 つのマテリアル B と 3 つのマテリアル C を要求した場合、結合テーブルには [ 1 (A の ID)、2 (B の ID)、1 (パーツの数)] および [1, 3, 3]。ここで、マテリアル B に 3 つのパーツ C と 4 つのパーツ D がある場合、エントリ [2 (B の ID)、3 (C の ID)、3 (パーツ)] と [2, 4 (D の ID)、4 (パーツ]。これを引き出すと、ルート (A) から開始し、結合テーブルに親 ID = A の ID を持つすべてのエントリを要求し、次に各子マテリアル ID で同じことを行います (テーブルに次のすべてのエントリを要求します)。子 ID を親マテリアルとして) など. ある種の最大深度を指定しない限り、再帰関数である必要があります。
潜在的な問題は、マテリアル A を B に依存させ、B を A に依存させると、無限の再帰が発生することです。ループが発生しないように、ツリーの上位にあるものを参照する子がいないことを確認するために、深刻なエラー チェックを行う必要があります。このエラー チェックを作成することは、おそらくこの実装の最も難しい部分です。
SQL (私の知る限り) は再帰を実際にはサポートしていないため、select ステートメントをすべて 1 つとして実行することはできません。返される行数が 0 になる最後に到達するまで、何度も何度も実行し続けます。また、この関数をネストされた配列で構築する必要があります。これを簡単にページの出力に変換できます。
パラメータ化されたクエリについては、php の PDO ライブラリを調べてください。パラメーター化されたクエリは、多くの sql インジェクションの問題も解決します。私の意見では、これは一般的な方法です。
あまり混乱していないことを願っています...あなたの質問は基本的に実装を求めていましたが、実装の説明を短くするのは難しいと思います.短くしようとすると、何かを言及するのを忘れてしまうことがあります.