【问题标题】:How to loop through all children in DB?如何遍历数据库中的所有孩子?
【发布时间】:2022-01-05 20:03:05
【问题描述】:

数据库中的表:(这基本上是文件夹)

|groupId|  name   |parentId|
  1       system1     0
  2       subsystem1  1
  3       subsystem2  2
  4       subsubMisc  2

应该给

system1
  -subsystem1
    --subsystem2
    --subsubMisc

到目前为止,只有第一个孩子填充,subsystem1 没有给我孩子。如果他们有任何孩子,我需要以下所有孩子:

[
    {
        "name": "system1",
        "children": [
            {
                "name": "subsystem1",
                "children": [
                    {
                        "name": "subsystem2",
                    },
                    {
                        "name": "subsubMisc",
                    }
                ]
            }
        ]
    }
]

我的代码:

public function getTreeMenu()
{
    $result = false;
    $data = $this->repository->getRootParents(); // SELECT * FROM myTable WHERE parentId = 0 
    
    foreach ($data as $row) {
        $children = $this->repository->getFolderChildren($row['parentId']); // SELECT * FROM myTable WHERE pid = :parentId ORDER BY name
        if ($children !== false) {
            $result[] = array(
                'name' => $row['name'],
                'children' => $children,
            );
        } else {
            $result[] = array(
                'name' => $row['name'],
            );
        }
    }
    return $result;
}

这仅适用于第一级。如何为给定文件夹连续循环子文件夹?

【问题讨论】:

  • 这是一个函数吗?我看到了return $result; 但没有功能
  • 是的,它是一个类中的函数。
  • 然后显示为函数,完成函数
  • 表格中的一些示例行也有助于我们理解
  • 遍历任意深度的数据结构或多或少是递归函数的实际用例。

标签: php json oracle loops pdo


【解决方案1】:

Oracle 提供了一个非常方便的hierarchical query 扩展,或者您可以使用SQL 标准递归查询。您可以在单个查询中获取整个层次结构。 (see demo)

select lpad ( ' ', 2*(level-1),'-') || name 
  from table_in_db 
 start with parent_id = 0 
 connect by parent_id = prior group_id ;

注意:lpad 函数实际上不是必需的。它提供了每个级别的缩进和破折号。不完全是你所拥有的,但很接近。您的代码应该能够构造 JSON。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多