階層データを効率的に表現するには、クロージャ テーブルの使用を検討してください。このコンテキストでは、クロージャー テーブルはツリー構造の祖先と子孫の間の関係を維持し、階層の取得と表現を効率的にします。
ツリー構造をクエリするには、次のようにします。特定のノードの子孫を階層内のレベルとともに取得する SQL クエリを実行できます。指定したレベルまでの子孫を取得するクエリの例を次に示します。
SELECT d.*, p.a AS '_parent' FROM longnames AS a JOIN closure AS c ON (c.a = a.tsn) JOIN longnames AS d ON (c.d = d.tsn) LEFT OUTER JOIN closure AS p ON (p.d = d.tsn AND p.l = 1) WHERE a.tsn = ? AND c.l <= ? ORDER BY c.l;
クエリ結果が取得されたら、それらを処理して階層配列構造を作成できます。これには、行を階層別に並べ替え、それに応じてグループ化し、データと子配列の両方を含むオブジェクトとしてノードを含む配列を作成することが含まれます。
配列構造を拡張するには、行データの連想配列とその子の Rowset オブジェクトを含むカスタム Row オブジェクト。リーフ ノードの子の Rowset は空です。
カスタム クラスには、データ コンテンツを再帰的に単純な配列に変換する toArrayDeep() のようなメソッドを含めることもでき、簡単なデータ エクスポートを可能にします。 .
このシステムを使用するには、まず分類テーブル データ ゲートウェイのインスタンスを取得し、次に目的のツリー構造をフェッチします。
// Get an instance of the taxonomy table data gateway $tax = new Taxonomy(); // Query tree starting at Rodentia (id 180130), to a depth of 2 $tree = $tax->fetchTree(180130, 2); // Dump out the array var_export($tree->toArrayDeep());
各パスの深さを決定するには、新しいノードをクロージャ テーブルに挿入し、階層内の追加場所に基づいて適切なレベルを計算します。 LAST_INSERT_ID() 関数は、新しく挿入されたノードの ID を取得するのに役立ちます。
以上がデータベースの結果を階層配列オブジェクトに変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。