代码之家  ›  专栏  ›  技术社区  ›  Mohamad

在CF中嵌套查询

  •  1
  • Mohamad  · 技术社区  · 15 年前

    1. browse.cfm是通过指定platformID为1的链接访问的
    2. browse.cfm将列出所有可用的平台
    3. 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>
      

    然而,通过使用这种方法,我得到了一个无效的嵌套配置。我该怎么解决这个问题?还是有其他方法来实现同样的想法?

    谢谢

    我的问题:

    <!---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 回复  |  直到 15 年前
        1
  •  3
  •   Sergey Galashyn    15 年前

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

    在我看来,使用cfoutput在查询上循环是一种老式的方式,应该避免。使用cfoutput作为输出,cfloop作为循环,您将拥有更可读的代码。

        2
  •  2
  •   rip747    15 年前

    更值得考虑的是在两个表之间使用内部联接,在一个查询中组合并检索所有内容,然后使用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>
    
    推荐文章