Как установить имя динамического ключа в структуре с колонкой cfquery? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть структура, в которой я хочу заменить ключ currentRow на столбец cfquery recID. Этот столбец является целым числом, который автоматически увеличивается в таблице sql. По какой-то причине мой код не может создать структуру с уникальным ключом. Вот мой код:

<cfquery name="qryAccounts" datasource="myDB">
   SELECT RecID, FirstName, LastName
   FROM Accounts WITH (NOLOCK)
</cfquery>

<cfloop query="qryAccounts">
    <cfset fnAccounts[RecID] = StructNew()>
    <cfset fnAccounts[RecID].RecordID = RecID>
    <cfset fnAccounts[RecID].FirstName = FirstName>
    <cfset fnAccounts[RecID].LastName = LastName>
</cfloop>

Код выше дал такой результат:

[
  {
    "FIRSTNAME": "Mike",
    "LASTNAME": "Richards",
    "RECORDID": 1
  },
  null,
  null,
  null,
  {
    "FIRSTNAME": "John",
    "LASTNAME": "Matt",
    "RECORDID": 6
  }
]

Тогда я попытался сделать это:

<cfquery name="qryAccounts" datasource="myDB">
   SELECT RecID, FirstName, LastName
   FROM Accounts WITH (NOLOCK)
</cfquery>

<cfloop query="qryAccounts">
    <cfset fnAccounts["ID"&RecID] = StructNew()>
    <cfset fnAccounts["ID"&RecID].RecordID = RecID>
    <cfset fnAccounts["ID"&RecID].FirstName = FirstName>
    <cfset fnAccounts["ID"&RecID].LastName = LastName>
</cfloop>

И код выше выдает правильный вывод:

{
  "ID1": {
  "FIRSTNAME": "Mike",
  "LASTNAME": "Richards",
  "RECORDID": 1
  },
"ID6": {
  "FIRSTNAME": "John",
  "LASTNAME": "Matt",
  "RECORDID": 6
  }
}

Мне интересно, почему первый код не может дать правильный вывод? Почему вторая версия с добавленной строкой работает нормально? Есть ли способ исправить или обойти эту проблему?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Мое решение основано на RRK, но мне больше нравится cfscript

<cfquery name="qryAccounts" datasource="myDB">
  SELECT RecID, FirstName, LastName
  FROM Accounts WITH (NOLOCK)
</cfquery>

<cfscript>
  fnAccounts = {};
  for (i in qryAccounts) {
     fnAccounts[i.RecID] = {
       RecordID : i.RecID,
       FirstName : i.FirstName,
       LastName : i.LastName
       };
     } // end for 
</cfscript>

cfquery можно перенести и в cfscript

0 голосов
/ 17 мая 2018

Вот более общий ответ, который будет работать для любого запроса.Я помещаю ключи структуры в нижний регистр, потому что я обычно использую этот вид функциональности для передачи данных запроса в json.

<cfscript>
    function queryToArray(q) {
        var ret = [];
        var cols = listToArray( q.columnList );
        for(var i in q) {
            var row = {};
            for(var col in cols ) {
                row[lcase(col)] =  i[col];
            }
            arrayAppend(ret, row);
        }
        return ret;
    }
</cfscript>

Размещение данных в массиве структур (вместо структуры, если структуры) кажется болееинтуитивно понятно при обращении к данным запроса.

0 голосов
/ 16 мая 2018

Все, что вам нужно сделать, это определить переменную fnAccounts как структуру.

<cfset fnAccounts = {}>

Без определения CF может свободно выбирать то, что кажется подходящим.

<cfquery name="qryAccounts" datasource="myDB">
   SELECT RecID, FirstName, LastName
   FROM Accounts WITH (NOLOCK)
</cfquery>

<cfset fnAccounts = {}>
<cfloop query="qryAccounts">
    <cfset fnAccounts[RecID] = StructNew()>
    <cfset fnAccounts[RecID].RecordID = RecID>
    <cfset fnAccounts[RecID].FirstName = FirstName>
    <cfset fnAccounts[RecID].LastName = LastName>
</cfloop>

Поскольку вы пытаетесь использовать RecID в качестве ключа целочисленного значения, онпохоже на то, как мы получаем доступ к массиву (fnAccounts[1] первая позиция в массиве).Как только вы определили fnAccounts как структуру, ColdFusion может рассматривать переменную как структуру.

DEMO

...