首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据库中的ParentID创建嵌套的<ul>树结构

从数据库中的ParentID创建嵌套的<ul>树结构
EN

Stack Overflow用户
提问于 2011-07-11 21:31:11
回答 5查看 2.1K关注 0票数 3

这似乎是我想要做的一项很普通的任务,但我不能把头绕在cfloops和cfqueries上。

我有一个充满照片画廊的数据库。它们都有一个ID和一个ParentID (除了根库--它们的ParentID是空的),而且它们可以深入到多个层次。下面是画廊结构的一个示例:

  • 1-1
  • 1-2

  • 1

  • 2-1-1
  • 2-1-2

  • 2
    • 2-1

代码语言:javascript
复制
- 2-2

我想自动将上面的结构输出到嵌套的ul和li(就像上面那样)。那是怎么做到的?我不能把我的头围绕着ul和li的位置来正确显示层次结构。

EN

回答 5

Stack Overflow用户

发布于 2011-07-11 22:17:28

我想最简单的解决方案是使用查询.

如果数据集很大,请尝试使用<cftree>并按需填充树叶。

票数 1
EN

Stack Overflow用户

发布于 2011-07-11 22:28:25

我将使用查询来递归地执行此操作。

注意:下面的代码没有经过测试,因此请将其视为示例psuedocode。

代码语言:javascript
复制
<cfquery query="qReadAllData">
  select * from your_table
</cfquery>

<!--- Read all roots (no parent ID) --->
<cfquery query="qReadRoots" dbtype="query">
  select nodeID from qReadAllData
  where parentID is null
</cfquery>

<ul>
  <cfloop query="qReadRoots">

    <cfset processNode(qReadRoots.nodeID) />

  </cfloop>
</ul>


<cffunction name="processNode" output="true">
  <cfargument name="nodeID" type="any" />

  <!--- Check for any nodes that have *this* node as a parent --->
  <cfquery query="LOCAL.qFindChildren" dbtype="query">
    select nodeID from qReadAllData
    where parentID = #ARGUMENTS.nodeID#
  </cfquery>

  <cfif LOCAL.qFindChildren.recordcount>

    <!--- We have another list! --->
    <li>
      <ul>
        <!--- We have children, so process these first --->
        <cfloop query="LOCAL.qFindChildren">

          <!--- Recursively call function --->
          <cfset processNode(LOCAL.qFindChildren.nodeID) />

        </cfloop>

      </ul>
    <li>


  <cfelse>

     <!--- We have no more children, so we just output the value --->
     <li>#nodeID#<li>

  </cfif>

</cffunction>

很晚了。我累了。我希望这是对的:)

票数 1
EN

Stack Overflow用户

发布于 2011-07-12 21:51:25

这是SQL和Coldfusion的混合体。在Server中格式化标签可能不是最好的,但它确实提供了所需的格式。

SQL:

代码语言:javascript
复制
CREATE TABLE testTable(id int, parentID int)
INSERT INTO testTable(id, parentID) VALUES
    (1, NULL)
    , (2, 1)
    , (3, 1)
    , (4, NULL)
    , (5, 4)
    , (6, 5)
    , (7, 5)
    , (8, 4)

Coldfusion:

代码语言:javascript
复制
<cfscript>
    qs = new query();
    qs.setDatasource("datasource");
    qs.setSQL("
        ;WITH cte AS
        (
            SELECT t.ID, t.parentID, 1 AS level, 
                CAST(DENSE_RANK() OVER (PARTITION BY t.parentID ORDER BY t.ID) AS varchar(max)) AS label
            FROM testTable t
            WHERE parentID IS NULL

            UNION ALL 

            SELECT t.ID, t.parentID, cte.level + 1 AS level, 
                CAST(cte.label AS varchar(max)) + ' - ' + CAST(DENSE_RANK() OVER (PARTITION BY t.parentID ORDER BY t.ID) AS varchar(max)) AS label
            FROM testTable t
                INNER JOIN cte ON cte.ID = t.parentID
        )
        SELECT *,
            DENSE_RANK() OVER (PARTITION BY parentID ORDER BY ID) AS [order]
        FROM cte
        ORDER BY label
    ");
    qMenu = qs.execute().getResult();

    oldLevel = 0;

    for (i=1;i<=qMenu.recordCount;i++){        
        if (qMenu.level[i] > oldLevel) {
            WriteOutput("<ul>");
        }

        while (qMenu.level[i] < oldLevel) {
            WriteOutput("</ul>");
            oldLevel--;
        }

        WriteOutput("<li>" & qMenu.label[i] & "</li>");

        oldLevel = qMenu.level[i];

    }

    do {
        WriteOutput("</ul>");
        oldLevel--;
    } while (oldLevel > 0);
</cfscript>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6656859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档