我是ColdFusion的新手,并且有一个有趣的问题,即使用从查询函数生成的查询来访问cfloop中的变量。
我知道我可以创建一个变量,将查询函数的结果赋给变量,然后遍历包含查询结果的变量,并使用给定循环内查询属性的变量名来访问数据,如下所示:
<cfscript>
q = createObject("component", "cfc.myDBquery");
result = q.myQuery();
</cfscript>
<cfloop query="result">
<cfoutput># result.MY_DATA #</cfoutput>
</cfloop>
但是,请考虑以下示例:
<cfscript>
q = createObject("component", "cfc.myDBquery");
</cfscript>
<cfloop query="#q.myQuery()#">
<cfoutput># ???.MY_DATA #</cfoutput>
</cfloop>
除了使用查询中的列名输出数据(例如MY_DATA)之外,在循环中输出数据时如何引用此特定查询?
FWIW,Adobe在其文档中显示了这种类型的场景,但是无法使用此方法在循环内显示输出数据:
我知道我尝试从代码中删除一行时有点神经质,我只是好奇,如果在遵守最佳做法的情况下甚至可以这样做。
答案 0 :(得分:1)
这是一个长格式的评论。这里:
<cfscript>
q = createObject("component", "cfc.myDBquery");
result = q.myQuery();
</cfscript>
创建对象使myQuery()函数可用。它实际上并没有运行它。你或许可以这样做:
result = createObject("component", "cfc.myDBquery").myQuery();
接下来,既然您询问了最佳做法,请不要这样做:
<cfloop query="result">
<cfoutput># result.MY_DATA #</cfoutput>
</cfloop>
每次循环执行cfoutput标记。相反,这样做:
<cfoutput>
<cfloop query="result">
#result.MY_DATA #
</cfloop>
</cfoutput>
或者
<cfoutput query="result">
#MY_DATA#
</cfoutput>
它表现得像一个循环。关于最佳实践的其他评论仅仅是意见。我的一个是可读代码是很好的代码。
答案 1 :(得分:-1)
我相信有两种可能性。首先,在循环查询时,ColdFusion不需要范围,因此您只需从查询中引用所需的字段名称,如下所示:
<cfloop query="#q.myQuery()#">
<cfoutput>#MY_DATA#</cfoutput>
</cfloop>
了解非范围变量会导致混淆和愤怒,我相信您可以从函数调用中引用原始查询的名称。例如,如果你的myQuery()&#39;功能类似于:
<cffunction name="myQuery">
<cfquery datasource="myDS" name="myQry">
SELECT * FROM Names
</cfquery>
<cfreturn myQry>
</cffunction>
然后你可以参考myQry&#39;像这样:
<cfloop query="#q.myQuery()#">
<cfoutput>#myQry.MY_DATA#</cfoutput>
</cfloop>