2012-08-07 60 views
3

我想在PHP和MySql中建立一个动态菜单(带有子菜单)。并试图建立动态的编辑器来操作这个菜单,创建,删除等。我创建菜单类别时已经堆叠了它的位置。要了解好看看MySQL表结构=>编辑动态菜单php mysql

create table menu(
id int(5) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
sort_id UNSIGNED BIGINT NOT NULL, 
title VARCHAR(20) NOT NULL, 
etc ...); 

我排序菜单分类与sort_id,创造我给这列不同的值(首次,默认情况下),因为创建另一个在后类别中,我将值加1并减1,但我认为这样做很不好。任何想法如何管理MySql表来定义创建的类别的位置(这将是前进还是后退)?谢谢:)

+0

在sort_id,只是把父菜单的ID,并把0/-1的根菜单。 (取决于你的SQL管理器如何启动ID。 – Jerska 2012-08-07 20:38:56

+0

以及没有任何父级菜单的主菜单类别如何? – tnanoba 2012-08-07 20:39:58

+0

已经在编辑中得到解答 – Jerska 2012-08-07 20:40:14

回答

3

您不应该使用@Jerska所说的sort_id,因为那样您将无法对您的子菜单进行排序&它会使您的程序逻辑复杂化/混淆。如果PARENT_ID设置为null,那么它是根菜单,你可以有一个表,这样反而

CREATE TABLE menu(
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    parent_id INT, 
    FOREIGN KEY(parent_id) REFERENCES menu(id), 
    sort_id INT, 
    title VARCHAR(100) 
) ENGINE=InnoDB; 


这是给你一个例子菜单:

首页&花园
- 生活
房 - 餐厅
- 卫浴
- 卧室
- 花园&学院
ELECTRICALS
- Sound & Vi锡永
- 计算&手机
- 家电
- 小家电

这将存储这样的:

INSERT INTO menu 
    (parent_id, sort_id, title) 
VALUES 
    (null, 1, "Home & Garden"), 
    (null, 2, "Electricals"), 
    (1, 1, "Living Room"), 
    (1, 2, "Dining Room"), 
    (1, 3, "Bathroom"), 
    (1, 4, "Bedroom"), 
    (1, 5, "Garden & Conservatory"), 
    (2, 1, "Sound & Vision"), 
    (2, 4, "Small Appliances"), 
    (2, 3, "Home Appliances"), 
    (2, 2, "Computing & Phones"); 

如果你确实按照这个顺序插入他们的“家&的ID Garden“为1,”Electricals“的ID为2(不要与sort_id混淆),”Living Room“的ID为3,”Dining Room“的ID为4 ...因为我们在ID字段上自动递增。

所以,如果你想在声音&愿景有一个子类别说,首先你会找到ID,在这种情况下,它会是8,然后你会添加新的记录与家长ID为8

举例子子类:

Electricals 
- Sound & Vision 
    * Televisions 
    * Audio 

你会插入这些记录:

INSERT INTO menu 
    (parent_id, sort_id, title) 
VALUES 
    (8, 1, "Televisions"), 
    (8, 2, "Audio"); 
+0

与这种有点表结构可以有多个子菜单?我的意思是只有这张桌子? – tnanoba 2012-08-07 20:47:57

+0

@Tornike如果菜单中有一个parent_id指向另一个菜单,该菜单的parent_id指向一个parent_id为NULL的菜单,您会怎么想? – Ozzy 2012-08-07 20:49:59

+0

实际上,在我看来,sort_id被用作父级ID。然后一切都很好。他也可以对它进行分类。 – Jerska 2012-08-07 20:51:51

3

在sort_id中,只需放置父菜单的ID,并为根菜单,只需将0/NULL。

实施例:(SID = sort_id)

id|sid| title 
1 | 0 | Menu1 
2 | 0 | Menu2 
3 | 1 | Submenu1of1 
4 | 1 | Submenu2of1 
5 | 2 | Submenu1of2 
6 | 4 | Subsubmenu1of2of1 

将指:

1 : Menu1 
    3 : Submenu1of1 
    4 : Submenu2of1 
     6 : Submenu1of2of1 
2 : Menu2 
    5 : Submenu1of2 

立即使步骤1和步骤2之间的转换是你的工作的一部分。
使用递归,你会没事的。 :)