возвращение структуры запросов - PullRequest
2 голосов
/ 17 ноября 2011

Если серия запросов создается так:

<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] является строка, имеющая то же значение, что и имя элемента ... так что мне делать, чтобы вместо этого назначить запрос с этим именем? Я уверен, что это смехотворно очевидно. (

EDIT

Я дам ответ Шону, хотя я наконец-то понял, в чем заключаются мои основные проблемы. Во-первых, я не осознавал, что

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

4 голосов
/ 17 ноября 2011

Попробуйте

<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 убедиться, что это объект запроса.

3 голосов
/ 18 ноября 2011

Атрибут запроса <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, разделенный запятыми.

...