Verschachtelung von Abfragen in CF
-
14-09-2020 - |
Frage
Ich verwende diesen Code, um eine Liste von Plattformen anzuzeigen.Wenn beim Betreten der Seite eine Plattform-ID angegeben wurde, möchte ich eine Liste von Genres unterhalb der angegebenen Plattform erstellen.
- Auf browse.cfm wurde über einen Link zugegriffen, der eine Plattform-ID von 1 angab
- browse.cfm listet alle verfügbaren Plattformen auf
browse.cfm listet nun alle verfügbaren Genres unter der Plattform-ID 1 auf.
<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>
Bei Verwendung dieses Ansatzes erhalte ich jedoch eine ungültige Verschachtelungskonfiguration.Wie kann ich das beheben?Oder gibt es einen anderen Ansatz, um die gleiche Idee zu erreichen?
Danke
MEINE Fragen:
<!---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>
Lösung
Sie können verwenden <cfloop query="qGetGenres"></cfloop>
, sie können verschachtelt werden.
Meiner Meinung nach ist die Verwendung von cfoutput zum Durchlaufen der Abfragen altmodisch und sollte vermieden werden.Verwenden Sie cfoutput für die Ausgabe und cfloop für die Schleife, und Sie erhalten besser lesbaren Code.
Andere Tipps
more food for thought is to use an inner join between the two tables, combine and retrieve everything in one query and then use cfoutput's group attribute to display the results:
<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>