2010-08-14 4 views
2

Я пытаюсь построить здесь хлебную крошку, и у меня возникают проблемы с этим. Проблема возникает из-за того, что мне нужно сохранить название категории (на двух языках), slug и id.Попытка получить путь к узлу с PHP и MySQL

Мои категории таблица выглядит следующим образом:

CREATE TABLE `categories` (
`category_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, 
`category_name` varchar(256) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
`category_slug` varchar(256) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
`category_parent` smallint(5) unsigned NOT NULL DEFAULT '0', 
`category_description_ro` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
`category_description_en` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
PRIMARY KEY (`category_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=latin1 

пыльник пример данных в таблице:

category id | category name | category_parent 

1   Categoria 1   0   
2   Categoria 2   0   
3   Categoria 3   0   
4   Categoria 1.1   1   
5   Categoria 1.2   1   
6   Categoria 1.3   1   
7   Categoria 1.1.2  4 

я должен отметить, что я не могу делать какие-либо изменения в таблицу MySQL ,

Что я хотел бы достигнуть, чтобы построить хлебную крошку, как:

Главная> Categoria 1> Categoria 1,1> Categoria 1.1.2

Может кто-нибудь обеспечить небольшой фрагмент кода о том, как это сделать? Я уже пробовал код «путь к узлу» от here, но, как я уже сказал, мне нужно включить в этот массив category_name, category_slug, category_description_ro и category_description_en. Спасибо заранее, ребята.

ответ

1

В псевдокоде:

$currentID = 7; 
do{ 
    $category = getCategoryByID($currentID); 
    $currentID = $category['category_parent']; 

    $crumb .= $category['category_name']; 
}while($category['category_parent']); 

Это будет просто цикл обратно дерево категорий, строительство крошку, пока не нет больше родителей.

2

Вы организуете свои иерархические данные, используя adjacency list model. Тот факт, что такие рекурсивные операции сложны, на самом деле является одним из главных недостатков этой модели.

Некоторые СУБД, такие как SQL Server 2005, Postgres 8.4 и Oracle 11g, поддерживают рекурсивные запросы с использованием common table expressions с ключевым словом WITH. Эта функция позволяет легко писать такие вопросы, как это, но, к сожалению, MySQL не поддерживает рекурсивные запросы.

Вы упомянули, что не можете внести никаких изменений в свой стол, но можете ли вы добавить дополнительную таблицу? Если да, то вы можете можете быть заинтересованы в проверке из следующей статьи, которая описывает альтернативную модель (nested set model), что делает рекурсивные операции проще (возможные):

Кроме того, я также рекомендуем проверить следующее выступление @Bill Karwin, постоянным автором на переполнение стека:

Модель таблицы закрытия, описанная в презентации, является очень эффективной альтернативой вложенному набору. Он также описывает эту модель в своей книге SQL Antipatterns (excerpt from the chapter on this topic).

В противном случае вы можете захотеть сделать рекурсивную часть в своем приложении, в php, как @geon suggested в другом ответе.

+0

Мне понравилась презентация Билла Карвина, спасибо. – Psyche

Смежные вопросы