Результаты запроса цикла Coldfusion и обновление с использованием динамических имен столбцов

В базе данных у меня есть 5 столбцов плюс идентификатор:

 id, m1, m2, m3, m4, m5

Я выбираю из одной таблицы, которая может иметь от 1 до 5 строк в зависимости от идентификатора:

row,id,value
 1, 1, 'A'
 2, 1, 'B'
 3, 1, 'C'

и т. д. Что мне нужно сделать, так это обновить столбцы m1, m2 и m3 в пользовательской таблице для идентификатора пользователя 1 со значениями A, B и C. Я начал что-то вроде этого, но я ударяю серьезный мозг понедельника во вторник .

i=1;
  cfloop (query=q) {
    field = 'm' & i;
    temp = invoke(myCFC,"updateUser",{ userid=q.id, field = q.value });
    i++;
  };

Где «поле» будет m1, m2, m3. Одним из способов было бы использовать переключатель / случай для количества записей и иметь 5 разных вызовов, но не уверен, что программно будет лучший способ?

[править] это работает, но может быть не лучшим способом - у меня есть случаи для 1-5:

switch(qryM.recordCount) {
case "1":
    temp = invoke(userCFC,"updateUser", { 
        id = qryM.rsm_userid, 
        m1_c = qryM["rsm_c"][1], 
        m1_m = qryM["rsm_m"][1]
    });
    break;
case "2":
    temp = invoke(userCFC,"updateUser", { 
        id = qryM.rsm_userid, 
        m1_c = qryM["rsm_c"][1], 
        m1_m = qryM["rsm_m"][1],
        m2_c = qryM["rsm_c"][2], 
        m2_m = qryM["rsm_m"][2]
    });     
    break;

person Steve    schedule 30.10.2018    source источник
comment
Что такое cfloop? Этот синтаксис мне незнаком. Не будет ли это циклом for в CFScript, а если это не CFScript, то тегом <cfloop>?   -  person Tomalak    schedule 30.10.2018
comment
Я использовал циклы for/in, но видел сообщение в блоге о том, что cfloop(query=, group=) и т.д. работает. Я никогда не видел его до сегодняшнего дня. Запуск обновления CF2016 7.   -  person Steve    schedule 30.10.2018
comment
Вы правы, это работает. Я полностью пропустил это, мне нужно будет немного почитать.   -  person Tomalak    schedule 30.10.2018
comment
cfloop() будет работать в cfscript. Почти все теги будут работать так в cfscript. Это полезно для создания чистого cfscript, но может привести к странностям. В этом случае я бы выбрал решение for-in.   -  person James A Mohler    schedule 30.10.2018
comment
Вы обновляете все 5 столбцов или только один из них? Если вы прокручиваете свой запрос2, чтобы выполнить обновление query1.column для каждой строки, вы будете избивать свою базу данных. Возможно, вы сможете делать то, что хотите, с помощью PIVOT. У вас есть образцы данных? И какие-то ожидания?   -  person Shawn    schedule 31.10.2018
comment
И нужно ли для этого возвращаться к CF? Вы можете сделать это в чистом SQL. Каков ваш рабочий процесс для этого?   -  person Shawn    schedule 31.10.2018
comment
И вы определенно не хотели бы invoke для каждой итерации. Вы можете new или createobject перед своим циклом, а затем просто вызывать свой метод на каждой итерации.   -  person Shawn    schedule 31.10.2018
comment
И вы INSERTing, UPDATEing или оба? И это для одного id, верно? У вас не будет несколько id? И если UPDATEing, если в вашей базе данных уже есть m4, но у вас только 3 строки, вы будете null из m4 и UPDATE 1-3, или вы оставите m4 как есть?   -  person Shawn    schedule 31.10.2018


Ответы (1)


Если действительно может быть максимум пять строк, а целевой столбец всегда равен «m» + номер текущей строки, тогда это будет работать:

for (row in q) {
    myCFC.updateUser(userid:row.id, field:'m#q.CurrentRow#');
}
person Tomalak    schedule 30.10.2018
comment
столбцы будут m1, m2, m3, m4, m5, а значения будут qryM [rsc_m] [currentrow] - хотя я продолжал получать ошибки в части имен динамических полей. Что произойдет, если я определяю все 5 имен полей, но имею значения только для первых 3 строк? Выдает ли qryM[rsc_m][5] ошибку, если количество записей запроса равно 3, и я пытаюсь ввести значение для строки 4 или 5? - person Steve; 30.10.2018
comment
Что ж, с циклом for ... in вам не нужно использовать ссылку [CurrentRow]. Когда есть только 3 строки, запрос выполняется только 3 раза, и да, будет ошибка, когда вы попытаетесь получить доступ к строке 4. Я все еще не совсем уверен, в чем проблема, я признаю. - person Tomalak; 30.10.2018