2010-07-12 70 views
1

我使用此代码来显示平台列表。如果在输入页面时指定了platformID,我想创建指定平台下的流派列表。在CF中嵌套查询

  1. browse.cfm经所指定1
  2. browse.cfm的platformID将列出所有可用的平台
  3. browse.cfm现在列出的1

    platformID下所有可用的流派链接访问
    <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> 
    

通过使用这种方法,但是,我发现了一个无效的嵌套配置。我该如何解决?还是有另一种方法来实现相同的想法?

感谢

我的查询:

<!---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> 

回答

3

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

IMO,使用cfoutput循环查询是旧式,应该避免。将cfoutput用于输出,cfloop用于循环,并且您将拥有更多可读代码。

+0

塞尔吉,谢谢你的提示。有用。但是如果你考虑使用cfoutput查询是过时的,有没有办法在没有它的情况下执行上面的代码?或者在这种情况下可以继续使用cfoutput查询吗? – Mohamad 2010-07-12 18:04:35

+1

对于分组查询需要使用'cfoutput'循环,但不适用于简单嵌套。你可以简单地将'cfoutput'包装到你的整个HTML中,'cfloop'中的变量将按照预期呈现。 – 2010-07-12 18:47:11

+0

使用cfloop的唯一问题是它不支持组属性,但在大多数情况下它们是可互换的 – rip747 2010-07-13 16:11:30

2

更加回味无穷是使用两个表之间的内部连接,结合在一个查询检索所有内容,然后用CFOUTPUT的组属性来显示结果:

<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> 
+0

有趣的解决方案。感谢分享它。我想我会看看我的代码,并决定什么是解决方案...有一个单一的查询是有吸引力的想法,虽然... – Mohamad 2010-07-13 19:16:08

+0

rip747,请你解释你为什么写了以下内容:?是否阻止某人输入数字以外的内容并导致代码崩溃?它将如何工作在一个设置中,我正在使用cffunction ...我只是将该行添加到cfargument标记下的函数中,该标记将是platformID ...在该momement中,我仅在激活WHERE子句之后使用IsNumeric() – Mohamad 2010-07-14 04:52:36

+1

@mel:你在问题的两个部分都是正确的。使用val()是一个非常基本的形式(你可以进一步)。例如val()将返回浮点数,但在这种情况下,您只需要一个整数。为此,您将使用val()和int()的组合来确保浮点数不会通过。我会用这个更新我的答案。 – rip747 2010-07-14 12:31:27