これも、何年かに一度使う機会はあるけど、すぐに頭から抜け落ちてしまうのでメモに残しておこう。
取得したクエリオブジェクト(クエリ変数)から取得した列のリストを取得したいと思った時、CFユーザーが真っ先に思い浮かぶのがクエリオブジェクト.columnList
だと思う。
例えば、下記のEMPLOYEESテーブルから<cfquery>
で取得したクエリオブジェクトがあったとする。
<cfquery datasource="dsn" name="qEmp"> SELECT * FROM EMPLOYEES </cfquery>
クエリオブジェクト.columnList
で取得した列のリストを取得できるのだが、アルファベット順にソートされてしまう。
<cfoutput>#qEmp.columnList#</cfoutput> (結果) COMMISSION_PCT,DEPARTMENT_ID,EMAIL,EMPLOYEE_ID,FIRST_NAME,HIRE_DATE,JOB_ID,LAST_NAME,MANAGER_ID,PHONE_NUMBER,SALARY
カラムリストをソートさせずに取得順に表示したい場合はどうするか? 自分が知っているのは3つの方法がある。
1. (非公式)クエリオブジェクト.getColumnList()
を使用する
ColdFusion MX 7の頃から非公式なテクニックとして紹介されていた方法。ColdFusion 2021でも使用できるが、今でも公式なドキュメントには掲載されていないので非公式な方法である。getColumnList()メソッドを使用するとソートされていないカラムリストを配列で取得できるので、その後は希望する形に変換する
<cfdump var="#qEmp.getColumnList()#">
(結果)
<cfoutput>#ArrayToList(qEmp.getColumnList())#</cfoutput> (結果) EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID
2. (非公式)UDF queryColumns(クエリオブジェクト)
を使用する
有志によって公開されているユーザー定義関数(UDF)を使った方法である。対象がMX6以降なので、こちらも古くから紹介されている情報だ。
ColdFusion 2021でも使用できるが、こちらも非公式な方法である。UDFのコードを見ると分かるが、クエリオブジェクトに対して.getMetadata()
という内部メソッドを利用している。1.と同様に非公式なメソッドを使用した方法となる。
<cfoutput>#queryColumns(qEmp)#</cfoutput> (結果) EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID
3. ColdFusion関数のGetMetadata()
を使用して作り込む
ColdFusionで用意されているGetMetadata()
関数(2.のメソッドと同じ関数名なので混同しないように注意)を使用すると、オブジェクトに関連するメタデータ(コンポーネントのメソッド、プロパティ、パラメータなど)を取得できる。ColdFusion MX 7からは、クエリオブジェクトにも対応した。
この関数を使用するとカラムごとに配列で情報が格納されているので、そこからカラムリストを抜き出してリストにする。
<cfdump var="#getMetaData(qEmp)#">
(結果)
<cfset aColumnList=getMetaData(qEmp)> <cfset queryFields = ""> <cfloop array="#aColumnList#" item="itm"> <cfset queryFields = listAppend(queryFields,itm["name"])> </cfloop> <cfoutput>#queryFields#</cfoutput> (結果) EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID