ColdFusion - 使用从UDF

时间:2017-08-29 16:08:41

标签: coldfusion cfml cfloop

我是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在其文档中显示了这种类型的场景,但是无法使用此方法在循环内显示输出数据:

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

我知道我尝试从代码中删除一行时有点神经质,我只是好奇,如果在遵守最佳做法的情况下甚至可以这样做。

2 个答案:

答案 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>