Récupération de catégories récursives avec une seule requête MySQL
Dans le contexte de l'organisation du contenu d'un site Web, les catégories récursives permettent des structures hiérarchiques à plusieurs niveaux. Pour récupérer efficacement ces catégories à partir d'une base de données MySQL, une seule requête est généralement utilisée.
MySQL propose l'opérateur CONNECT_BY_ROOT, qui permet une sélection récursive de données. Considérons la requête suivante :
SELECT category_id, name, parent FROM categories CONNECT BY ROOT parent ORDER BY LEVEL
Cette requête récupère toutes les catégories du tableau, en les connectant hiérarchiquement en fonction de la colonne parent. La fonction LEVEL attribue un niveau à chaque ligne, indiquant sa position dans la hiérarchie, la catégorie de niveau supérieur ayant un niveau de 1.
Pour construire l'arborescence récursive en PHP, convertissez les résultats de la requête en un tableau, où chaque catégorie est représentée comme un nœud avec une propriété enfants. L'exemple suivant illustre le processus :
$nodeList = []; $tree = []; $query = mysql_query("SELECT category_id, name, parent FROM categories ORDER BY parent"); while ($row = mysql_fetch_assoc($query)) { $nodeList[$row['category_id']] = array_merge($row, ['children' => []]); } foreach ($nodeList as $nodeId => &$node) { if (!$node['parent'] || !array_key_exists($node['parent'], $nodeList)) { $tree[] = &$node; } else { $nodeList[$node['parent']]['children'][] = &$node; } } unset($node); unset($nodeList); // Return the tree structure return $tree;
Ce code PHP construit un tableau multidimensionnel reflétant les relations hiérarchiques entre les catégories. Les catégories de niveau supérieur sont placées dans le tableau $tree et leurs enfants sont imbriqués dans leurs tableaux enfants respectifs.
Cette approche utilise des références aux nœuds, ce qui minimise l'utilisation de la mémoire par rapport à la création de nouveaux objets nœuds. Il évite également les requêtes SQL récursives, ce qui le rend plus efficace pour les grandes arborescences.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!