我有一个名为Organizations
id | organization | parent_id
-----+---------------+-----------
51 | Organ1 | 0
71 | Organ2 | 0
83 | Organ2.1 | 71
89 | Organ1.1 | 51
104 | Organ1.1.1 | 89
...
拥有parent_id = 0
的组织是根组织。现在我看到我错了。 parent_id
定义组织的父组织。
首先对我来说这看起来很棒。因此,我会在一个表中创建无穷无尽的嵌套子组织。
现在我被困在如何确定组织的深度。
我目前的尝试现在如下:
<?php
$queryRootOrg = $db->prepare("SELECT * FROM Organizations WHERE parent_id = 0" );
$queryRootOrg ->execute();
$menu = "<ul id='menu'>";
if($queryRootOrg ->rowCount() > 0)
{
while($rowRoot = $queryRootOrg ->fetch(PDO::FETCH_ASSOC))
{
$menu .= "<li><a href='?org=".$rowRoot['id']."'>".$rowRoot['birim']."</a>";
$queryChildren= $db->prepare("SELECT * FROM Organizations WHERE parent_id = :p1");
$queryChildren->bindValue(":p1", $rowRoot['id'], PDO::PARAM_INT);
$queryChildren->execute();
if ($queryChildren->rowCount() > 0)
{
$menu .= "<ul>";
while($rowSub = $queryChildren->fetch(PDO::FETCH_ASSOC))
{
$menu .= "<li><a href='?org=" . $rowSub['id'] . "'>" . $rowSub['birim'] . "</a></li>";
}
$menu .= "</ul>";
}
$menu .= "</li>";
}
}
$menu .= "</ul>";
?>
这段代码只给我两个层次。我想我无法在列表中看到第三级组织。 我的问题是,在这种情况下,我怎么知道组织的深度?还是有另一种方法吗?
答案 0 :(得分:1)
请参考以下链接,因为它提供了通过树状结构进行路由的所有方法,
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
答案 1 :(得分:1)
您可以使用mysql nested set model(此链接也应该回答您所有相关的任务)
然而,与您一样,父ID的方法是一个很好的方法,因为它简单而且健壮。
在某些情况下,它只缺乏表现。
基本上除了总是通过迭代和计算迭代来选择父项之外别无他法。
你可以在php中使用单独的查询以及内部mysql函数(过程)来做到这一点。如果你在postgres上,你也可以进行递归查询。
在你的情况下,尽管我认为最好将深度与父母一起存储,但请记住,当事情发生变化时你必须重新计算它。
答案 2 :(得分:1)
您可以尝试只读取MySQL中的所有数据并手动构建一个PHP树,如果您的数据库不大,那么这将是最简单的方法。