0

我是 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-jl/cfloop-looping-over-a-query.html

我知道我试图从我的代码中删除一行有点神经质,我只是好奇在坚持最佳实践的同时这是否可能。

4

2 回答 2

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>

它的行为就像一个循环。其他关于最佳实践的评论只是意见。我的一个是可读的代码是好的代码。

于 2017-08-29T17:11:32.860 回答
-1

我相信有两种可能。首先,ColdFusion 在循环查询时不需要范围,因此您可以像这样从查询中引用所需的字段名称:

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

知道非作用域变量会引起混乱和愤怒,我相信您可以从函数调用中引用原始查询的名称。例如,如果您的“myQuery()”函数类似于:

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

然后你可以像这样引用'myQry':

<cfloop query="#q.myQuery()#">
<cfoutput>#myQry.MY_DATA#</cfoutput>
</cfloop>
于 2017-08-29T17:07:14.570 回答