Standard Query Iteration Values Available During For-In Loop In ColdFusion
A decade ago, ColdFusion introduced the for-in
loop syntax for Query iteration. And, in the decade since, I somehow completely missed the fact that the underlying query iteration mechanics were still being used. That is, the .currentRow
and default value accessors are still made available on the query object within the for-in
iteration block. This allows us to access both the row object and the row index using the for-in
syntax.
To see what I mean, let's manually construct and populate a Query object and then iterate over it using for-in
. Within each iteration, we'll output both the row-based data and the query-based data:
<cfscript>
data = queryNew(
"id, value",
"varchar, varchar",
[
[ id: 101, value: "Hello" ],
[ id: 102, value: "my" ],
[ id: 103, value: "good" ],
[ id: 104, value: "fellow" ]
]
);
for ( record in data ) {
// When using a FOR-IN loop over a Query object, we usually just use the row
// object to access our information.
echo( record.id );
echo( " → " );
echo( record.value );
echo( "<br />" );
// HOWEVER, under the hood, the ColdFUsion runtime is still ITERATING over the
// QUERY object, which means that traditional access pathways are still available
// (ie, the currentRow is updated and the default column-value points the current
// row if no row-index is provided).
echo( data.value );
echo( " @ " );
echo( data.currentRow );
echo( "<br /><br />" );
}
</cfscript>
As you can see, inside of our for-in
query, we're using both the row references:
record.id
record.value
... as well as the traditional query-based iteration references:
data.currentRow
data.value
- with the row-index implicitly pointing to the current row.
And, when we run this in Adobe ColdFusion 2021 and Lucee CFML 5, we get the following output:
101 → Hello
Hello @ 1102 → my
my @ 2103 → good
good @ 3104 → fellow
fellow @ 4
As you can see, even though we're not using the traditional CFLoop[query]
iteration, the for-in
syntax is still applying the traditional iteration mechanics behind the scenes. This allows us to reference the .currentRow
while using the more modern query iteration syntax. Pretty cool! Not sure how I missed this for the last 10-years.
Want to use code from this post? Check out the license.
Reader Comments