如果创建了一系列查询:
<cfloop list="#platform_list#" index="x">
<cfquery name="#trim(x)#" dbtype="query">
<!--- stuff to build the query --->
</cfquery>
</cfloop>
然后我在结构中返回查询:
<cfset queries_RET = StructNew() />
<cfloop list="#platform_list#" index="x">
<cfif StructKeyExists(args, #trim(x)#)>
<!--- here's where I think things go horribly wrong --->
<cfset queries_RET[x] = #x# />
</cfif>
</cfloop>
<cfreturn queries_RET />
然后当以“graphData”的形式返回调用函数时,我尝试像这样访问它:
<cfloop list="#platform_list#" index="x">
<cfif StructKeyExists(url, x) and StructKeyExists(graphData, x)>
<cfloop query="graphData[x]">
我在最后一行收到错误:
Attribute validation error for tag cfloop.
The value of the attribute query, which is currently graphData[x], is invalid.
graphData [x]中struct的值是一个与元素名称具有相同值的字符串...那么我该怎么做才能为该查询分配查询呢?我确定这是非常明显的。 :(
修改
我会给Shawn一个答案,虽然我终于弄明白我的潜在问题是什么。首先,我没有意识到这一点
<cfset queries_RET[x] = #x# />
实际上并不将查询分配给x处的元素,而是将其引用给它。要分配实际的查询对象,我需要这样做:
<cfset queries_RET[x] = #Evaluate(x)# />
其次,当结构返回到调用函数时,调用
<cfloop list="#Application.platform_list#" index="x">
<cfloop query="#graphData[x]#">
不起作用,因为cfloop的查询属性正在查找引用到查询对象---并且它查找的查询对象不存在,因为它还没有回。
最后,既然我实际上正在返回一个有效的查询对象,那么该查询属性仍然不起作用,因为现在graphData [x]不是引用。为了使它工作,我必须首先分配一个引用,并将其用作cfloop中的查询属性:
<cfloop list="#Application.platform_list#" index="x">
<cfset thisQuery = #graphData[x]#>
<cfloop query="thisQuery">
我认为我的基本问题是不理解查询属性不是实际的查询对象,而是引用。这是一个学习曲线!
答案 0 :(得分:4)
尝试
<cfloop list="#platform_list#" index="x">
<cfif StructKeyExists(url, x) and StructKeyExists(graphData, url[x])>
<cfset q = graphData[x]>
<cfloop query="q">
如果抛出
属性查询的值(当前为q)无效
然后你应该cfdump q确保它是一个查询对象。
答案 1 :(得分:3)
<CFLOOP>
查询属性采用查询(字符串)的名称,而不是实际的查询对象。
当你将某些内容传递给该属性时,CF希望它是一个字符串。
如果它是文字,CF会希望它是有效查询的名称。
如果它是变量,CF会期望变量的值等于查询的名称。
因此,您最终想要的输出是:
<cfloop list="#platform_list#" index="x">
<cfloop query="#x#">
以下是完整的代码片段,可以确认这一点,您可以参考/比较自己的代码:
<cfset query_a = QueryNew('id,name,pass') />
<cfset QueryAddRow(query_a)>
<cfset QuerySetCell(query_a,'id',1)>
<cfset QuerySetCell(query_a,'name','joe')>
<cfset QuerySetCell(query_a,'pass','joe123')>
<cfset query_b = QueryNew('id,name,pass') />
<cfset QueryAddRow(query_b)>
<cfset QuerySetCell(query_b,'id',4)>
<cfset QuerySetCell(query_b,'name','pete')>
<cfset QuerySetCell(query_b,'pass','pete123')>
<cfset query_c = QueryNew('id,name,pass') />
<cfset QueryAddRow(query_c)>
<cfset QuerySetCell(query_c,'id',7)>
<cfset QuerySetCell(query_c,'name','frank')>
<cfset QuerySetCell(query_c,'pass','frank123')>
<cfset platform_list = 'query_a,query_b,query_c' />
<cfloop list="#platform_list#" index="x">
<cfloop query="#x#">
<cfoutput>#id# #name# #pass#</cfoutput><br/>
</cfloop>
</cfloop>
你会注意到在这个片段中,如果你将查询属性改回“x”(而不是#x#),你将产生你现在遇到的完全相同的错误。
为什么?
答案:platform_list是逗号分隔的字符串列表(x通过循环变为),而不是以逗号分隔的Query对象列表。