我正在尝试用PHP和mySQL编写一个高度动态的导航生成器。
我旅行得很好,但我已经到了一个我不知道去哪里的地方。
我已经获得了所有PHP代码来创建一个多维数组,然后生成HTML。这很好。
我的数据库结构的方式如下:(我省略了某些不相关的行..回答这个问题时请记住这一点。)
tbl:navigation
id |name |parent |handle
1 | home | 0 | 1
2 | about | 0 | 2
3 | contact | 0 | 4
4 | products | 0 | 3
5 | computers | 4 | 3
tbl:handle
id |handle |redirect_to
1 | home | 0
2 | about | 0
3 | contact-us | 0
4 | products | 0
5 | products/computers | 0
我想要实现的是print_r(),导致导航中每行的内容类似于此...
Array (
[id]=>1
[name]=>home
[parent]=>0
[handle]=>Array (
[id]=>1
[handle]=>home
[redirect_to]=>0
)
是否可以在mySQL级别执行此操作,还是必须使用PHP执行此操作?
答案 0 :(得分:0)
MySQL中没有内置的层次结构概念(我不知道),所以我想你必须在php中这样做。如果您在撰写查询时遇到问题,请考虑使用the nested set model。
答案 1 :(得分:0)
只需使用MySQL中的连接来获取正确的句柄,从handles
中选择的所有字段都将显示在数组中,并在数据库中指定正确的键/值。
SELECT
`navigation`.*,
`handles`.`redirect_to`,
`handles`.`handle`
FROM `navigation`
INNER JOIN `handles` ON
`navigation`.`handle` = `handles`.`id`
在组织和从像MySQL这样的关系数据库中获取数据时,这只是冰山一角。知道在哪里使用什么查询类型可以非常强大。如果您在其他查询的循环中嵌入了查询,则可以一次获取所有数据。
答案 2 :(得分:0)
你不能在mysql中直接做到这一点,它也需要一些PHP。
SELECT
n.id as nav_id,
n.name as nav_name,
n.parent as nav_parent,
n.handle as nav_handle,
h.id as handle_id,
h.handle as handle_handle,
h.redirect_to as handle_redirect_to
FROM navigation n
LEFT JOIN handle h ON n.handle_id = h.id
$nav = array();
foreach($results as $data) {
array_filter($data); // removes null values
$link = array(
'id' => $data['nav_name'],
'name' => $data['nav_name'],
'parent' => $data['nav_parent']
);
if (isset($data['handle_id'])) {
$link['handle'] = array(
'id' => $data['handle_id'],
'handle' => $data['handle_handle'],
'redirect_to' => $data['handle_redirect_to']
);
}
}