Como obter um nome de atributo dinâmico no CFLOOP sobre a consulta em Coldfusion
-
24-09-2019 - |
Pergunta
Estou dentro de um cfloop
sobre uma consulta. Quero obter um atributo, mas não saberei qual será esse atributo até o tempo de execução. Usando #qryResult[MyAttr]#
falha com o erro "Os tipos de objetos complexos não podem ser convertidos em valores simples". Qual é a sintaxe para fazer isso?
Aqui está um exemplo simplificado:
<cfquery datasource="TestSource" name="qryResult">
SELECT * FROM MyTable
</cfquery>
<cfloop query="qryResult">
<cfset MyAttr="autoid" />
<cfoutput>
Test 1: #qryResult.autoid# <br/> <!--- succeeds --->
Test 2: #qryResult[MyAttr]# <br/> <!--- fails --->
</cfoutput>
</cfloop>
Solução
<cfloop query="qryResult">
<cfset MyAttr="autoid" />
<cfoutput>
Test 1: #qryResult.autoid# <br/> <!--- succeeds --->
Test 2: #qryResult[MyAttr][qryResult.CurrentRow]# <br/> <!--- succeeds --->
</cfoutput>
</cfloop>
CurrentRow
está implícito na sintaxe literal (query.col
). Está ligado ao índice de <cfloop query="...">
/<cfoutput query="...">
(ou 1 quando usado fora de um loop).
Mencionar isso explicitamente é necessário na sintaxe "índice de matriz" (query[col][row]
), Porque query[col]
por si só retorna o objeto da coluna (que é o "tipo complexo" ao qual o erro se refere).
Efeito colateral: você pode usar isso para acesso aleatório a um resultado de consulta fora de um loop (ou seja, como uma matriz multidimensional). Depois de conhecer os números das linhas que lhe interessam, você pode acessar as linhas diretamente.