coldfusion中的邻接列表

coldfusion中的邻接列表,coldfusion,adjacency-list,Coldfusion,Adjacency List,这张图片展示了我正在努力实现的目标。左边是表数据,右边是我试图创建的表 该表使用parentID引用同一表中的另一项以创建层次结构 我将如何创建查询并以这种方式组织它们 如果我选择海盗并想得到所有的父母呢?在CFML中有什么东西比循环查询更容易做到这一点,直到我到达顶部 我还没有测试过这个…: <!--- item.cfc ---> <cfcomponent persistent="true" cache="read-only"> <cfproperty n

这张图片展示了我正在努力实现的目标。左边是表数据,右边是我试图创建的表

该表使用parentID引用同一表中的另一项以创建层次结构

我将如何创建查询并以这种方式组织它们

如果我选择海盗并想得到所有的父母呢?在CFML中有什么东西比循环查询更容易做到这一点,直到我到达顶部


我还没有测试过这个…:

<!--- item.cfc --->
<cfcomponent persistent="true" cache="read-only">
    <cfproperty name="id" fieldtype="id">
    <cfproperty name="parent"
                fieldtype="many-to-one" cfc="item" fkcolumn="ParentID">
    <cfproperty name="children" type="array"
                fieldtype="one-to-many" cfc="item" fkcolumn="ParentID" inverse="true">
</cfcomponent>

<!--- display.cfm --->
<cffunction name="printItem" output="true">
    <cfargument name="item" required="true">
    <table>
        <tr>
        <td>#item.getName()#

        <cfif item.hasChildren()>
            <table>
              <cfloop array="#item.getChildren()#" index="local.i">
                  <tr>
                      <td>#printItem(local.i)#
              </cfloop>
            </table>
        </cfif>
    </table>
</cffunction>

<cfset printItem( entityLoadByPK("item",1) )>

您的分层数据使用一种称为,您最终使用哪一个取决于数据更改的频率以及您正在使用的底层数据库(其中一些数据库具有便于查询邻接列表的功能),其中主要的是CTE。有关使用其他数据库执行此操作的方法,请参见问题链接


-在您的情况下,正确缩进。如果您的数据库没有CTE,并且没有另一种容易查询的方式,考虑使用不同的方法,可能是最容易访问的,其中检索速度很快,但代价是更复杂的变化算法,即插入、删除、移动。p> 在考虑类似需求时,我考虑过的一种方法是异步构建层次结构,即使用AJAX请求。根据您的需要,这可能适用于您,也可能不适用于您,但是想象一下,您不是立即构建整个树,而是最初向用户展示顶层。然后,当用户选择一个顶级项时,会发出一个AJAX请求来查找所选项的子项。根据需要为每个子级重复此操作以构建树。通过这种方式,问题非常简单,用于实现它的查询和代码也非常简单。

这就是我在您的帮助下得出的结论

<!--- adjacency list display --->
<cffunction name="adjacentList" output="true">
    <cfargument name="alQuery" required="true">
    <cfargument name="qid" required="false" default="0">

        <cfquery name="alSubQuery" dbtype="query">
            SELECT * FROM alQuery WHERE parentID=#qid#
        </cfquery>

        <cfif alSubQuery.RecordCount neq 0>
            <ul>
            <cfloop query="alSubQuery">
                <li>
                #name#
                #adjacentList(#alQuery#,#id#)#
                </li>
            </cfloop>
            </ul>
        </cfif>
</cffunction>

使用:adjacentListquery

只要使用邻接列表模型,就必须循环。但归根结底,更多的是选择正确的模型来表示层次结构数据。orangepips答案中的链接对可用选项、嵌套集等提供了很好的总结。。。注意:CTE使生活更轻松,但在引擎盖下,您仍然循环使用cftree,这可能不是一个坏主意MySQL用于测试,但我将使用MSSQL,所以我使用最基本的SQL功能来确保这两种工作。您也可以考虑使用MS SQL进行测试。因此,您将更好地了解实际结果以及可能遇到的任何问题。此外,您还可以尝试使用CTE。。旁注:确保var作用于所有函数局部变量