返回查询结构

时间:2011-11-17 19:18:51

标签: coldfusion

如果创建了一系列查询:

<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">

我认为我的基本问题是不理解查询属性不是实际的查询对象,而是引用。这是一个学习曲线!

2 个答案:

答案 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对象列表。