php - 根据 mysql 数据库的分解数据动态创建菜单

标签 php mysql database laravel navigation

我很难找到一种简单的方法来使用存储在 mysql 数据库中的数据重新创建导航结构。我无法更改数据库结构,它是自动生成的。

我使用 Laravel 5.2 作为该项目的基础框架。

这是数据库结构:

数据:

| id | origin | type       | value                              |
|----|--------|------------|------------------------------------|
| 1  | 20     | menuLevel  | 0                                  |
| 2  | 20     | menuTitle  | The title of this menu item        |
| 3  | 20     | menuParent | 0                                  |
| 4  | 20     | menuUrl    | /url-of-the-menu                   |
| 5  | 21     | menuLevel  | 1                                  |
| 6  | 21     | menuTitle  | The title of this second menu item |
| 7  | 21     | menuParent | 20                                 |
| 8  | 21     | menuUrl    | /url-of-the-submenu                |

还有更多此类数据。但所有菜单项始终包含四个属性,即级别、标题、url 和我必须放在一起的父项。

通过这种结构,我尝试重新创建导航,但找不到查询数据库以获得结果的正确方法,然后我可以将结果与 jquery 树插件一起使用来浏览生成的菜单。

理想情况下,这个结构是:

{
    'origin': {
        'menuLevel': 0,
        'menuTitle': 'The title',
        'menuParent': 0,
        'menuUrl': '/url'
    }, and so on..
}

有人已经面对过这种结构吗?实现这一目标的最佳方法是什么?预先感谢您为我指明了正确的方向。

最佳答案

如果'origin'您的意思是20,您可能可以查询

SELECT * FROM [tablename] ORDER BY origin

然后将它们放入一个数组中,直到origin发生变化,然后打开一个新数组。这也会获取非结构化数据。

如果您想要这四个属性,您可以执行如下查询

SELECT t1.origin, t1.value as menuLevel, t2.value as menuTitle, 
       t3.value as menuParent, t4.value as menuUrl
FROM [table] t1
LEFT JOIN [table] t2 ON (t1.origin=t2.origin AND t2.type='menuTitle')
LEFT JOIN [table] t3 ON (t1.origin=t3.origin AND t3.type='menuParent')
LEFT JOIN [table] t4 ON (t1.origin=t4.origin AND t4.type='menuUrl')
WHERE t1.type='menuLevel'

这也可以扩展到所有非结构化数据,然后您将拥有大量可以过滤或不过滤的 NULL

添加:我希望 laravel 在 (id, type) 上建立索引,否则这个查询可能会很慢。

关于php - 根据 mysql 数据库的分解数据动态创建菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38451323/

相关文章:

php - TYPO3 登录错误

php - Xpath选择注释代码

mysql 在 linestring mbrcontains 中使用 lat long 列

mysql - 使用 `mysqldump `写入数据库缓慢

mysql - 如何计算或查看我的数据库在 mysql 中的性能?

php - laravel-5.2 分页不起作用 - 未定义方法 stdClass::links() 错误

php - 如何在 png/jpg 扩展中运行 php 脚本

java - 使用spring连接mysql,如何模拟连接池?

database - 备份 Wordpress 多站点

node.js - 在权限管理方面,Active Directory 是否仍能与 Node.js 模块相媲美?