Я бы упростил структуру данных, если вам нужна возможность многоуровневых подкатегорий (что, как вы сказали, возможно).Лучший способ найти что-то подобное - это сделать что-то немного другое с данными:
category
+----+-----------+------------+----------------------------+
| id | parent_id | sort_order | name |
+----+-----------+------------+----------------------------+
| 1 | 0 | 0 | A Night Out |
| 2 | 1 | 1 | Clubs and Societies |
| 3 | 1 | 2 | Public houses |
| 4 | 1 | 3 | Restaurants |
| 5 | 1 | 4 | Taxis ... |
| 6 | 1 | 5 | Theatres ... |
| 7 | 1 | 6 | Wine Bars |
| 8 | 0 | 0 | Accommodation |
| 9 | 8 | 1 | Bed and Breakfast |
| 10 | 8 | 2 | Guest Houses |
| x | x | x | ... and so on ... |
+----+-----------+------------+----------------------------+
Примечание: я только , использую sort_order
для сортировки подочерние узлы с одним и тем же родителем.
Теперь я бы создал действительно простой SQL-запрос, чтобы просто получить данные, упорядоченные по parent_id
затем sort_order
:
SELECT category.id, category.parent_id, category.name FROM category ORDER BY category.parent_id ASC, category.sort_order ASC
Теперь прибываетзабавная часть ... потому что, на самом деле, нам нужны структурированные данные, поэтому я бы передал запрос в XML DOMDocument () для создания системы структурированных категорий.
По сути, вы перебираете данные и, выполняя этот цикл, вы создаете узлы с идентификатором, например, node_{$category_id}
, и затем вы можете назначить дочерние узлы их родителям в правильном порядке.Затем вы можете использовать стандартную DOM-навигацию для получения нужного дерева данных.
Самое большое преимущество в этом заключается в том, что вы можете начать с любого дочернего узла и вернуться обратно к дереву узлов, чтобы создатьсписок вашей категории - это означает, что вы можете развернуть и свернуть его.
Недавно я написал гораздо более подробное объяснение;Я могу опубликовать ссылку на него, если хотите.