编辑动态菜单php mysql

时间:2012-08-07 20:36:01

标签: php mysql

我正在尝试在Php和MySql中构建动态菜单(带子菜单)。并尝试使用此菜单构建动态编辑器进行操作,创建,删除等。在创建菜单类别时,我已经堆叠了它的位置。要好好理解一下mysql table structure =>

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表来定义创建的类别(前进或后退)的位置?谢谢:))

2 个答案:

答案 0 :(得分: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之间进行转换是您工作的一部分 使用递归,你会没事的。 :)

答案 1 :(得分:3)

你不应该像@Jerska所说的那样使用sort_id,因为那时你将无法对你的子菜单进行排序。它会使程序逻辑复杂化或混淆。您可以使用这样的表格

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;

如果parent_id设置为null,则它是根菜单。


这是一个示例菜单:

Home&花园
- 起居室
- 餐厅
- 浴室
- 卧室
- 花园&学院
ELECTRICALS
- 声音&视觉
- 计算机和手机
- 家用电器
- 小家电

它会像这样存储:

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");

如果您按实际顺序插入它们,“Home& Garden”的ID将为1,而“Electricals”的ID将为2(不要与sort_id混淆)和ID“Living”房间“将是3,”餐厅“的ID将是4 ...因为我们在ID字段上自动递增。

所以,如果你想在Sound&中找到一个子类别。愿景,首先您会找到ID,在这种情况下它将是8,然后您将添加父记录为8的新记录。

子子类别示例:

Electricals  
- Sound & Vision  
  * Televisions  
  * Audio  

您可以插入这些记录:

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