【问题标题】:Storing a nested navigation menu in MySQL在 MySQL 中存储嵌套导航菜单
【发布时间】:2014-07-05 06:37:06
【问题描述】:

我想在 MySQL 中存储一个嵌套关联数组。我需要这个用于我网站上的可嵌套导航菜单。嵌套的级别应该没有限制。

我研究了nested set modeladjacency list,但不确定哪个可以满足我的需求。

理想情况下,我将能够以一种可以在 PHP 中重建关联数组的方式查询我的表,然后使用它来构建我的导航菜单。 记录可能会被添加/更改/重新排序,但这只会很少发生。

我正在寻找 MySQL (InnoDB) 的示例表结构,查询以获取和重新排序记录,以及更新、删除和添加新记录。我在 PHP 中使用 PDO,因此任何关于如何将记录集转换为关联数组的示例代码也会有所帮助。

【问题讨论】:

  • 可能会有所帮助,我仍在使用此解决方案:stackoverflow.com/questions/9224229/…
  • 不幸的是,我看不出这将如何与 id - parent_id 设置一起使用。重构数组以包含子数组的递归函数要求项的父项必须已经在数组中,然后才能添加它。即使使用 ORDER BY,也无法通过 SQL 中的 select 语句来保证这一点,因为项目的 id 与其在列表中的顺序无关
  • 我将上面的代码与 MySQL 一起使用,它运行良好。这是我的表:pastie.org/9182539 navigation_link_id 是“父 ID”。我只使用select * from tbl order by display_order。我觉得和穆图的建议是一样的。
  • 顺序只在<ul> 列表中很重要,不需要是唯一的。如果分配了 parentID 但它不存在,则不会显示该项目。我现在有点想解释它,但就像我说的那样,我已经使用该帖子中的代码很长时间了。我在用户进行导航的地方运行 CMS。
  • 这应该是有用的阅读:stackoverflow.com/questions/4048151/…

标签: php mysql sql pdo


【解决方案1】:

试试下面的设计:

  1. “之前”列
  2. “之后”列
  3. “名称”列
  4. “ID”列

现在,只需根据需要存储 ID。

示例:导航菜单可能是

A --> B --> C

只需为菜单中的每个条目指定一个 ID,并使用唯一 ID 存储它。 然后将 BEFORE 和 AFTER 值作为 ID 输入到表中。

所以,对于 B,我们有

Entry for B:
BEFORE = ID(C) 
AFTER = ID(A) 
NAME = 'B'

这可以轻松扩展为多个嵌套菜单。

【讨论】:

  • @JakeGould 谢谢! :)
【解决方案2】:

我建议采用以下设计来实施解决方案。

表格:导航

Columns : 
ID (INT NOT NULL IDENTITY),
Description (VARCHAR),
ParentID (INT NULL) - Refer its own table ID column,
AdditionalColulmns..

【讨论】:

  • 好的,我理解整个外键引用同一个表中的 id 列(这是我相信的邻接列表),但是如何将结果转换为关联数组? SQL 选择应该是什么样的?
  • 能否请您提供一些您期望数组的示例,以便我可以尝试给出我的查询。
  • 数组应该是数组的数组。子数组是关联数组,包含titlehref 等键。每个子数组可能有一个名为children 的键,它是一个包含titlehref 等的数组。这个数组也可能有children,它是一个包含......列表的数组。这有意义吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
相关资源
最近更新 更多