2017-06-06 28 views
1

私は、ffunctionがJSON構造を返す必要があります。返す必要がある列は50以上あります。私の構造を手動で構築するのではなく、動的に構築したいと思います。最初にクエリをループし、各テーブルの列をループします。次に例を示します。cfqueryから構造体を構築する方法は?

 <cffunction name="getRecords" access="remote" output="true" returnformat="JSON"> 
      <cfargument name="userID" type="string" required="true"> 

      <cfset fnResults = StructNew()> 

      <cfquery name="myQuery" datasource="test"> 
       SELECT 
        ur_first, 
        ur_last, 
        ur_dob, 
        ur_gender, 
        ur_email, 
        ur_address, 
        ... and the rest of the columns 
       FROM Users 
       WHERE ur_id = <cfqueryparam value="#trim(arguments.userID)#" cfsqltype="cf_sql_char" maxlength="15"> 
       ORDER BY ur_createDt 
      </cfquery> 

      <cfset fnResults.recordcount = myQuery.recordcount>  

      <cfloop query="myQuery"> 
       <cfset qryRecs = StructNew()> 
       <cfloop array="#myQuery.getColumnList()#" index="columnName"> 
        <cfset qryRecs.'#columnName#' = URLEncodedFormat('#columnName#')> 
       </cfloop> 
      </cfloop> 

      <cfset fnResults.data = qryRecs> 

      <cfreturn fnResults> 
    </cffunction> 

このエラーは、私はAjaxのコールの後に戻って取得しています:

この行に参照
CFML variable name cannot end with a &quot;.&quot; character. 
The variable qryRecs. ends with a &quot;.&quot; character. You must either provide an additional structure key or delete the &quot;.&quot; character. 

443 : <cfset qryRecs.'#columnName#' = URLEncodedFormat('#columnName#')> 

私はqryRecsを構成する列名を設定したいですこのように:

<cfset qryRecs.ur_first = URLEncodedFormat(myQuery.ur_first)> 

この方法では、手動で50個以上の列を設定する必要はありません。それらはすべて動的に作成する必要があります。誰かが助けてくれたら教えてください。

+2

この行を ''と書くことをお勧めします。いずれにしても好ましいだろう。 –

+0

[アーカイブを検索](https://stackoverflow.com/search?q=%5Bcoldfusion%5D+dynamic+query+row)クエリ列に動的にアクセスするスレッドがたくさんあります。つまり、構造体は単一の行を含むクエリにのみ適しています。複数の行が含まれている場合は、構造体の配列を使用します。また、 'var/local'には、クエリ名とインデックス変数(" column ")を含むすべての関数変数を忘れないでください。 – Leigh

答えて

3

ColdFusionのクエリをいくつかの異なるJSON形式に変換できるArrayCollection objectを作成しました。これがあなたのニーズに合っているかどうか見てみてください。例えば

、このクエリ:

{ 
    "data": [ 
     { 
      "bookid": 8, 
      "genre": "Fiction", 
      "title": "Apparition Man" 
     }, 
     { 
      "bookid": 2, 
      "genre": "Non-fiction", 
      "title": "Shopping Mart Mania" 
     } 
    ] 
}

私も戻りメッセージにメタデータを追加するアップデートに取り組んでいます:

<cfquery name="rs.q" datasource="cfbookclub"> 
    SELECT DISTINCT 
     bookid, 
     title, 
     genre 
    FROM 
     books 
    WHERE 
     title LIKE <cfqueryparam value="%#arguments.term#%" cfsqltype="cf_sql_varchar" /> 
    ORDER BY 
     genre, title 
</cfquery>

は、このJSONに変換されます

{ 
    "success": true, 
    "message": "Array Collection created.", 
    "meta": { 
     "offset": 0, 
     "pageSize": 0, 
     "totalRecords": 0 
    }, 
    "data": [] 
};
関連する問題