ColdFusion — ссылки на переменные в cfloop с использованием запроса, сгенерированного из UDF

Я новичок в 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

Я знаю, что я немного невротик, пытаясь исключить одну строку из моего кода, мне просто любопытно, возможно ли это вообще, придерживаясь лучших практик.


person J. Bolliger    schedule 29.08.2017    source источник
comment
Передовую практику области запроса см. в этой теме: Нужно ли мне определять вывод запроса в ColdFusion.   -  person Twillen    schedule 30.08.2017


Ответы (2)


Это длинный отформатированный комментарий. Здесь:

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

Он ведет себя как петля. Другие комментарии о передовом опыте — это просто мнения. Одно из моих утверждений заключается в том, что читаемый код — это хороший код.

person Dan Bracuk    schedule 29.08.2017

Я считаю, что есть 2 возможности. Во-первых, 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>
person P Mascari    schedule 29.08.2017
comment
Проголосовали за то, что вызвали замешательство и гнев. Этот код нуждается в серьезной доработке - person James A Mohler; 30.08.2017
comment
Вы не можете ссылаться на имя исходного запроса, если функция имеет правильную область видимости var/local. - person Twillen; 30.08.2017