Cómo obtener un nombre de atributo dinámico en cfloop sobre consulta en ColdFusion
-
24-09-2019 - |
Pregunta
Estoy dentro de un cfloop
durante una consulta. Quiero conseguir un atributo, pero no voy a saber lo que ese atributo será hasta el tiempo de ejecución. Usando #qryResult[MyAttr]#
falla con el error "tipos de objetos complejos no pueden ser convertidos a valores simples." ¿Cuál es la sintaxis para hacer esto?
Este es un ejemplo 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>
Solución
<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ícita en la sintaxis literal (query.col
). Está ligado al índice de <cfloop query="...">
/ <cfoutput query="...">
(o 1 cuando se utiliza fuera de un bucle).
mencionarla explícitamente es necesario en la sintaxis "índice de matriz" (query[col][row]
), porque query[col]
solo devuelve el objeto de columna (que es el "tipo complejo" el error se refiere a).
Efecto secundario: Se puede utilizar este para el acceso aleatorio a un fuera resultado de la consulta de un bucle (es decir, como una matriz multidimensional). Una vez que conoce los números de las filas que le interesan, puede acceder directamente a las filas.