2011-06-17 33 views
5

我想通過一個函數,在這裏我通過行作爲一個結構從查詢處理一行。CFML - 查詢行構建

理想......

<cfloop query="myquery"> 
#myfunction(#row#)# 
</cfloop> 

我可以將它設置這樣太...

<cfloop query="myquery"> 
#myfunction(#col1#,#col2#,#col3#,#col4#)# 
</cfloop> 

,但我不想。我一直無法找到一個簡單的提取行的方式,但我想我會問。

回答

3

本納德爾發佈了一篇博客文章中關於這個,他舉了一個例子UDF一個查詢轉換成一個結構,它接受一個可選行參數,可以讓你把一個單排在查詢到一個結構。看看here

+1

我碰到這個來得早,我還以爲CFML可能已經在這方面取得了一些進展,在過去5年。似乎應該沒有任何黑客應該可用。 – Daniel

+0

我不確定它在覈心語言中會有多大用處。我不記得需要查詢行作爲結構。考慮到這是多麼容易在單行快速環路和填充結構,以及存在的UDF這樣做其實,在我看來,這將是一個不必要的除了語言。 –

3

這是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) /> 
13

發現多了幾分優雅的尋找解決方案,爲單列

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

Adob​​e ColdFusion,請現在有一個名爲功能將查詢中的行轉換爲結構。

附錄

此功能不可用的的ColdFusion 9和更早版本。

0

另一個解決方案是:

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]#'); 
}