2012-08-07 75 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之間的轉換是你的工作的一部分。
使用遞歸,你會沒事的。 :)