【问题标题】:returning query results as a formatted fieldname and fieldvalue types以格式化的字段名和字段值类型返回查询结果
【发布时间】:2021-03-27 13:09:45
【问题描述】:

我正在尝试获取查询结果以将查询结果显示为:ArrayofStructs 但是

按照我想要的方式,

[
    {"fieldname" : "Action",FieldValue":"Update"},
    {"fieldname" : "MainTitle",FieldValue":"Please Update Database"}
]

上面的例子如果只是一行,但我有 10 行,我正在尝试上面的输出,我怎么能在冷融合中做,如果它不像上面的情况,我可以选择 arrayofstructs 但是这真的很烦人

这是我的查询

SELECT pagetitle as Action, 
    Title as MainTitle,         
FROM QoQueries
ORDER BY pageTitle asc

我正在使用 ACF 2021

正如您所注意到的,它确实将列名和字段值输出为单独的而不是键/对

【问题讨论】:

  • 如果您能够为一行编写代码,请在查询循环中运行相同的代码。
  • 这就是问题所在,我知道我想要它,但不知道我应该怎么做,这就是我需要帮助的地方
  • 您能否修正问题中的引号,以便更清楚哪些是计算值?并提供一些关于数据库或 QoQ 数据的演示记录?
  • 如何将这些数据输出为 HTML,并以表格 fieldNamefieldValue 作为列标题? <th> 值。您会遍历查询并创建 HTML 对吗?现在创建一个空数组,然后使用这些键和查询值循环遍历一个结构。将结构添加到数组中,重复。
  • @AdrianJ.Moreno 是的,理论上这听起来不错,但我只是在努力想办法如何做到这一点,我在这里一无所知

标签: coldfusion lucee


【解决方案1】:

我会使用QueryReduce 调用来获取查询结果中的 ArrayOfStruct 输出。

<cfset result = myQuery.reduce(function(result=[], values){
  local.temp = [];
  for(local.key in arguments.values){
    local.temp.append({
      fieldname: local.key,
      FieldValue: arguments.values[local.key]
    });
  }
  arguments.result.append(local.temp);
  return arguments.result;
})>

【讨论】:

  • 问题是,我不知道如何像上面提到的那样输出数据,我知道我可以做的 arrayofstructs,但它必须是字段名/字段值类型的数据,我不知道怎么能我生成那个
  • 我已经更新了答案,这是你想要完成的吗?
  • 感谢更新的答案,但它嵌套在两个数组级别中,我们可以将它设为一个嵌套级别并作为结构而不是数组来做
  • 这是this 你在找什么吗?
【解决方案2】:

我同意 rrk。使用reduce() 会相当快速和高效,而且它应该能够为所欲为。

回顾这段代码,我意识到它和我做的事情几乎一样。它获得两个嵌套数组的原因是附加到local.temp = []。如果您删除该逻辑,您应该能够只创建您正在寻找的单个结构数组。

我改变的另一件事是使用箭头函数。它们与写出完整的函数没有太大区别,但它们更紧凑、更简洁。它们需要一点时间来适应,但我用得越多,我就越喜欢它们。

如果可以的话,我也会尽量避免显式循环。在处理更大的数据集时,使用 reduce() 之类的东西会明显更快。

我下面的代码将在 CF2018 或更高版本中运行,并且由于您指定了 CF2021,所以您应该很高兴。

<cfscript>
    res = myQuery.reduce( (prev, nxt) => {
        prev.append({"FIELDNAME":nxt.Action,"FIELDVALUE":nxt.MainTitle});
        return prev;
        }, []
    );
</cfscript>

小提琴更加充实。 https://cffiddle.org/app/file?filepath=89565618-18ae-49e0-bed0-bdb9fb6a4162/04567bb5-ec53-4097-a941-bb2b5f42a499/ec51b428-ec53-4606-a828-8dcce9b954b0.cfm

最后,几点说明。我不完全确定您是如何使用这些数据的,因此这些建议甚至可能不相关。此外,您的代码似乎表明您正在执行查询的查询。这也可能不需要(以及其中的 ORDER BY)。您的页面中可能已经有数据可用,并且可以从原始查询数据中提取出来。

【讨论】:

    【解决方案3】:

    由于该问题被标记为 Lucee,因此 rrk 的解决方案看起来是一个不错的方法。对于 Adob​​e Coldfusion 解决方案,您可以使用嵌套循环。下面的代码将简单地输出字段/值对,每个查询行在一行上。

    <cfoutput>
        <cfloop query = "myQuery">
            <cfloop list = "#myQuery.columnlist#" index = ColumnName>
                #ColumnName#  #myQuery[ColumnName][currentrow]#
            </cfloop>    
            <br>
        </cfloop>
    </cfoutput>
    

    你可以看到两行样本数据here的结果。

    【讨论】:

    • 它必须是这样的name: "ACTION' value : "Update" name: "MAINTITLE" value: "Please Update Database" name: "ACTION" value: "Delete" Name: "MAINTITLE" value: "Delete Record" - 上面的数组或结构的结构
    • 一般原理是一样的——嵌套循环。只需更改您在循环中执行的操作的详细信息。
    • 根据版本,ACF 也可以做 query.reduce()。 reduce() 应该比嵌套循环快得多,尤其是在结果中有很多行的情况下。虽然我怀疑这可能是 X-Y 问题。
    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多