2017-08-29 5 views
0

Je suis nouveau à ColdFusion et j'ai une question intéressante concernant l'accès aux variables à l'intérieur d'un cfloop en utilisant une requête générée à partir d'une fonction de requête. Je sais que je peux créer une variable, affecter le résultat de la fonction de requête à la variable, puis faire une boucle sur la variable contenant le résultat de la requête et accéder aux données en utilisant le nom de variable donné à la requête dans la boucle. suit:ColdFusion - Variables de référence dans cfloop utilisant la requête générée par UDF

<cfscript> 
    q = createObject("component", "cfc.myDBquery"); 
    result = q.myQuery(); 
</cfscript>  

<cfloop query="result"> 
    <cfoutput># result.MY_DATA #</cfoutput> 
</cfloop> 

Cependant, considérez cet exemple:

<cfscript> 
    q = createObject("component", "cfc.myDBquery"); 
</cfscript> 

<cfloop query="#q.myQuery()#"> 
    <cfoutput># ???.MY_DATA #</cfoutput> 
</cfloop> 

Autre que juste pour sortir les données en utilisant le nom de la colonne de la requête (par exemple my_data), comment pourrais-je aller sur le référencement de cette requête spécifique lorsque sortir des données dans la boucle?

FWIW, Adobe montre ce type de scénario dans leur documentation, ne cependant montrer la sortie de données à l'intérieur de la boucle en utilisant cette méthode:

https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-tags/tags-j-l/cfloop-looping-over-a-query.html

Je sais que je suis être un peu névrotique pour essayer pour éliminer une ligne de mon code, je suis juste curieux de savoir si cela est possible tout en adhérant aux meilleures pratiques.

+0

Pour l'étendue de la requête "meilleure pratique" voir ce fil de discussion: [Dois-je effectuer la recherche de la portée dans ColdFusion] (https: // stackoverflow.com/questions/10709193/do-i-have-to-scope-query-output-in-coldfusion). – Twillen

Répondre

-1

Je crois qu'il y a 2 possibilités. Tout d'abord, ColdFusion ne nécessite pas la portée lors de la boucle sur une requête pour que vous puissiez simplement référencer le nom de domaine dont vous avez besoin de la requête comme ceci:

<cfloop query="#q.myQuery()#"> 
<cfoutput>#MY_DATA#</cfoutput> 
</cfloop> 

Connaître les variables non-scope source de confusion et de colère, je crois que vous peut référencer le nom de la requête d'origine de votre appel de fonction. Par exemple, si votre fonction 'myQuery()' est quelque chose comme:

<cffunction name="myQuery"> 
<cfquery datasource="myDS" name="myQry"> 
    SELECT * FROM Names 
</cfquery> 
<cfreturn myQry> 
</cffunction> 

Ensuite, votre référence peut 'myQry' comme ceci:

<cfloop query="#q.myQuery()#"> 
<cfoutput>#myQry.MY_DATA#</cfoutput> 
</cfloop> 
+0

Renversé pour causer de la confusion et de la colère. –

+1

Downvoted pour provoquer la confusion et la colère. Ce code doit être sérieusement retravaillé. –

+0

Vous ne pouvez pas référencer le nom de la requête d'origine si la fonction est correctement définie sur var/local. – Twillen

1

Ceci est un commentaire à long format. Ici:

<cfscript> 
    q = createObject("component", "cfc.myDBquery"); 
    result = q.myQuery(); 
</cfscript> 

La création de l'objet rend la fonction myQuery() disponible. Il ne l'exécute pas réellement. Vous pourriez être en mesure de le faire:

result = createObject("component", "cfc.myDBquery").myQuery(); 

Ensuite, puisque vous avez demandé les meilleures pratiques, ne pas faire à ce sujet:

<cfloop query="result"> 
    <cfoutput># result.MY_DATA #</cfoutput> 
</cfloop> 

Vous exécutez la balise cfoutput chaque fois dans la boucle. Au lieu de cela, faites ceci:

<cfoutput> 
<cfloop query="result"> 
    #result.MY_DATA # 
</cfloop> 
</cfoutput> 

ou cette

<cfoutput query="result"> 
#MY_DATA# 
</cfoutput> 

Il se comporte comme une boucle. Les autres commentaires sur les meilleures pratiques sont simplement des opinions. L'un des miens est que le code lisible est bon code.