在CF中嵌套查询

时间:2010-07-12 17:42:00

标签: coldfusion nested cfquery

我正在使用此代码显示平台列表。如果在进入页面时指定了platformID,我想在指定平台下创建一个类型列表。

  1. 通过指定platformID为1
  2. 的链接访问browse.cfm
  3. browse.cfm将列出所有可用平台
  4. browse.cfm现在将列出platformID为1下的所有可用类型。

    <ul>
        <li>Browse</li>
        <cfoutput query="qGetPlatforms">
        <li>
            <a href="browse.cfm?platformID=#URLEncodedFormat(Trim(qGetPlatforms.platformID))#">#qGetPlatforms.pName#</a>
            <cfif URL.platformID EQ qGetPlatforms.platformID>
            <ul>
                <cfoutput query="qGetGenres">
                <li><a href="browse.cfm?genreID=#URLEncodedFormat(Trim(qGetGenres.genreID))#">#qGetGenres.gName#</a></li>
                </cfoutput>
            </ul>
            </cfif>
        </li>
        </cfoutput>
    </ul>
    
  5. 然而,通过使用这种方法,我得到了无效的嵌套配置。我该如何解决?或者是否有另一种方法来实现相同的想法?

    由于

    我的疑问:

    <!---Get platforms--->
    <cffunction
        name="fGetPlatforms"
        access="public"
        returntype="query"
        output="false"
        hint="I get all the platforms">
        <!---Local var--->
        <cfset qGetPlatforms = "">
        <!---Database query--->
        <cfquery name="qGetPlatforms" datasource="#REQUEST.datasource#">
        SELECT 
            platforms.platformID,
            platforms.platformName AS pName
        FROM
            platforms
        </cfquery>
        <cfreturn qGetPlatforms>
    </cffunction>    
    
    <!---Get genres--->
    <cffunction
        name="fGetGenres"
        access="public"
        returntype="query"
        output="false"
        hint="I get all the genres">
        <!---Local var--->
        <cfset qGetGenres = "">
        <!---Database query--->
        <cfquery name="qGetGenres" datasource="#REQUEST.datasource#">
        SELECT 
            genres.genreID,
            genres.genreName AS gName
        FROM
            genres
        </cfquery>
        <cfreturn qGetGenres>
    </cffunction>
    

2 个答案:

答案 0 :(得分:3)

您可以使用<cfloop query="qGetGenres"></cfloop>,它们可以嵌套。

IMO,使用cfoutput循环查询是旧样式,应该避免。使用cfoutput作为输出,使用cfloop进行循环,你将拥有更多可读代码。

答案 1 :(得分:2)

更多值得思考的是在两个表之间使用内部联接,在一个查询中组合并检索所有内容,然后使用cfoutput的group属性来显示结果:

<cfset URL.platformID = int(val(URL.platformID))>

<cfquery name="getPlatformsAndGenres" datasource="#REQUEST.datasource#">
SELECT
    p.platformID AS platformID
    ,p.platformName AS pName
    ,g.genreID AS genreID
    ,g.genreName AS gName
FROM
    platforms p
    INNER JOIN genres g
        ON p.platformID = g.platformID
WHERE
    p.platformID = <cfqueryparam cfsqltype="cf_sql_integer" value="#URL.platformID#">
ORDER BY
    pName
    ,genreName
</cfquery>

Once you have everything in one query, you can use <cfoutput query="getPlatformsAndGenres" group="pName">
to lessen your code:

<ul>
    <li>Browse</li>
    <cfoutput query="getPlatformsAndGenres" group="pName">
    <li>
        <a href="browse.cfm?platformID=#URLEncodedFormat(Trim(platformID))#">#pName#</a>
        <ul>
            <cfoutput>
            <li><a href="browse.cfm?genreID=#URLEncodedFormat(Trim(genreID))#">#gName#</a></li>
            </cfoutput>
        </ul>
        </cfif>
    </li>
    </cfoutput>
</ul>