从 mysql 数据库中的分解数据动态创建菜单
Dynamically create a menu from exploded datas from mysql database
我努力寻找一种简单的方法来使用存储在 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 和我必须放在一起的 parent 项。
使用这种结构,我尝试重新创建导航,但找不到查询数据库以获得结果的正确方法,然后我可以使用 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
可以过滤或不过滤。
add: 我希望 laravel 在 (id, type) 上建立索引,否则这个查询可能会很慢。
我努力寻找一种简单的方法来使用存储在 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 和我必须放在一起的 parent 项。
使用这种结构,我尝试重新创建导航,但找不到查询数据库以获得结果的正确方法,然后我可以使用 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
可以过滤或不过滤。
add: 我希望 laravel 在 (id, type) 上建立索引,否则这个查询可能会很慢。