我想通過一個函數,在這裏我通過行作爲一個結構從查詢處理一行。CFML - 查詢行構建
理想......
<cfloop query="myquery">
#myfunction(#row#)#
</cfloop>
我可以將它設置這樣太...
<cfloop query="myquery">
#myfunction(#col1#,#col2#,#col3#,#col4#)#
</cfloop>
,但我不想。我一直無法找到一個簡單的提取行的方式,但我想我會問。
我想通過一個函數,在這裏我通過行作爲一個結構從查詢處理一行。CFML - 查詢行構建
理想......
<cfloop query="myquery">
#myfunction(#row#)#
</cfloop>
我可以將它設置這樣太...
<cfloop query="myquery">
#myfunction(#col1#,#col2#,#col3#,#col4#)#
</cfloop>
,但我不想。我一直無法找到一個簡單的提取行的方式,但我想我會問。
本納德爾發佈了一篇博客文章中關於這個,他舉了一個例子UDF一個查詢轉換成一個結構,它接受一個可選行參數,可以讓你把一個單排在查詢到一個結構。看看here。
這是Ben的網站類沒有註釋
<--- --------------------------------------------------------------------------------------- ----
Blog Entry:
Ask Ben: Converting A Query To A Struct
Author:
Ben Nadel/Kinky Solutions
Link:
http://www.bennadel.com/index.cfm?event=blog.view&id=149
Date Posted:
Jul 19, 2006 at 7:32 AM
---- --------------------------------------------------------------------------------------- --->
<cffunction name="QueryToStruct" access="public" returntype="any" output="false"
hint="Converts an entire query or the given record to a struct. This might return a structure (single record) or an array of structures.">
<cfargument name="Query" type="query" required="true" />
<cfargument name="Row" type="numeric" required="false" default="0" />
<cfscript>
var LOCAL = StructNew();
if (ARGUMENTS.Row){
LOCAL.FromIndex = ARGUMENTS.Row;
LOCAL.ToIndex = ARGUMENTS.Row;
} else {
LOCAL.FromIndex = 1;
LOCAL.ToIndex = ARGUMENTS.Query.RecordCount;
}
LOCAL.Columns = ListToArray(ARGUMENTS.Query.ColumnList);
LOCAL.ColumnCount = ArrayLen(LOCAL.Columns);
LOCAL.DataArray = ArrayNew(1);
for (LOCAL.RowIndex = LOCAL.FromIndex ; LOCAL.RowIndex LTE LOCAL.ToIndex ; LOCAL.RowIndex = (LOCAL.RowIndex + 1)){
ArrayAppend(LOCAL.DataArray, StructNew());
LOCAL.DataArrayIndex = ArrayLen(LOCAL.DataArray);
for (LOCAL.ColumnIndex = 1 ; LOCAL.ColumnIndex LTE LOCAL.ColumnCount ; LOCAL.ColumnIndex = (LOCAL.ColumnIndex + 1)){
LOCAL.ColumnName = LOCAL.Columns[ LOCAL.ColumnIndex ];
LOCAL.DataArray[ LOCAL.DataArrayIndex ][ LOCAL.ColumnName ] = ARGUMENTS.Query[ LOCAL.ColumnName ][ LOCAL.RowIndex ];
}
}
if (ARGUMENTS.Row){
return(LOCAL.DataArray[ 1 ]);
} else {
return(LOCAL.DataArray);
}
</cfscript>
</cffunction>
使用...
<!--- Convert the entire query to an array of structures. --->
<cfset arrGirls = QueryToStruct(qGirls) />
<!--- Convert the second record to a structure. --->
<cfset objGirl = QueryToStruct(qGirls, 2) />
發現多了幾分優雅的尋找解決方案,爲單列
<cfscript>
function GetQueryRow(query, rowNumber) {
var i = 0;
var rowData = StructNew();
var cols = ListToArray(query.columnList);
for (i = 1; i lte ArrayLen(cols); i = i + 1) {
rowData[cols[i]] = query[cols[i]][rowNumber];
}
return rowData;
}
</cfscript>
Adobe ColdFusion,請現在有一個名爲功能將查詢中的行轉換爲結構。
附錄
此功能不可用的的ColdFusion 9和更早版本。
另一個解決方案是:
function QueryToStruct(query){
var cols = ListToArray(query.columnList);
var salida = query.map(function(v=0,i,a){
return {'#cols[1]#':v};
});
return ValueArray(salida,'#cols[1]#');
}
我碰到這個來得早,我還以爲CFML可能已經在這方面取得了一些進展,在過去5年。似乎應該沒有任何黑客應該可用。 – Daniel
我不確定它在覈心語言中會有多大用處。我不記得需要查詢行作爲結構。考慮到這是多麼容易在單行快速環路和填充結構,以及存在的UDF這樣做其實,在我看來,這將是一個不必要的除了語言。 –