循环查询以创建手动 ArryOfStructs 数据

loop over a query to create an Manual ArryOfStructs Data

我有一个查询数据,想用它创建一个手动结构数组,我正在使用这段代码,但它似乎是错误的。我在这里缺少什么应该在这里做什么

for(i in myquery) {
                st['Contact'][#i#]['ID'] = i.id;
                st['Contact'][#i#]['Name'] = i.name;
                st['Contact'][#i#]['Email'] = i.email;
            }

您的代码存在一些问题。我要分解它:

假设您有如下查询结果:

myquery= queryNew(
            "id, name, email",
            "integer,varchar,varchar",
            [ 
                {"id":43,"name":"Antonio", "email": "antonio@somedomain.com"}, 
                {"id":65,"name":"Manuel", "email": "manuel@somedomain.com"}, 
                {"id":77,"name":"Paula", "email": "paula@somedomain.com"},
                {"id":87,"name":"Jennifer", "email": "Jennifer@somedomain.com"}
                
            ]);

然后像您一样使用 for( row in query ) 遍历(循环)您的查询是行不通的:

    for( i in myquery ){
       st['Contact'][#i#]['ID'] = i.id;
       st['Contact'][#i#]['Name'] = i.name;
       st['Contact'][#i#]['Email'] = i.email;
    }

原因:

  • 当使用 for( row in myquery ) 时,您将逐行迭代查询。但是在你的循环中你想使用索引 i 来设置你的数组。那么,i 将不是您期望的数字整数,而是一个完整的行集。它会尝试使用完整的行作为索引,但这是行不通的。如果你需要一个索引,你还必须通过索引迭代你的查询,例如for (i = 1; i <= myquery.recordCount; i++)。作为参考,请参阅如何按索引迭代查询,请参阅 cfdocs here,或者使用 ArrayAppend()append() 成员而不使用任何索引。
  • 你需要先将st['Contact']定义为一个数组,其中包含st['Contact']=[];,否则CF会认为它是一个结构体
  • 此外,您使用 i 设置数组,但使用 [#i#] 输出它而没有任何引号。在包含这样的引号的输出中使用 #st['Contact']['#i#']['ID'] 或不包含这样的引号:st['Contact'][i]['ID']。但不是这样的 st['Contact'][#i#]....

更正您的代码,使 st.Contact 填充为数组,它可能类似于:

选择1:使用ArrayAppend()append()成员函数:

st['Contact']=[]; 
for ( i in myquery ) {
      st['Contact'].append( 
         {"id": myquery.id,
         "name": myquery.name,
         "email": myquery.email
         });
    }

相同但更简单:

st['Contact']=[]; 
for ( i in myquery ) {
      st['Contact'].append( i );
    }

备选方案 2: 使用 for (i = 1; i <= myquery.recordCount; i++)

按索引迭代查询
st['Contact']=[]; 
for (i = 1; i <= myquery.recordCount; i++) {
    st['Contact'][i]['ID'] = myquery.id[i];
    st['Contact'][i]['Name'] = myquery.name[i];
    st['Contact'][i]['Email'] = myquery.email[i];
            }

如果在我提交的查询的帮助下转储变量 st,您将获得以下数据结构(此处只是字符串化):

{"Contact":[
    {"Name":"Antonio","ID":43,"Email":"antonio@somedomain.com"},
    {"Name":"Manuel","ID":65,"Email":"manuel@somedomain.com"},
    {"Name":"Paula","ID":77,"Email":"paula@somedomain.com"},
    {"Name":"Jennifer","ID":87,"Email":"Jennifer@somedomain.com"}
    ]}

以下是两种备选方案的完整 cfscript 代码:


myquery= queryNew(
            "id, name, email",
            "integer,varchar,varchar",
            [ 
                {"id":43,"name":"Antonio", "email": "antonio@somedomain.com"}, 
                {"id":65,"name":"Manuel", "email": "manuel@somedomain.com"}, 
                {"id":77,"name":"Paula", "email": "paula@somedomain.com"},
                {"id":87,"name":"Jennifer", "email": "Jennifer@somedomain.com"}
                
            ]);
            
st['Contact']=[]; 
for ( i in myquery ) {
      st['Contact'].append( 
         {"id": myquery.id,
         "name": myquery.name,
         "email": myquery.email
         });
    }
dump(st);

// simplier version of above
st['Contact']=[]; 
for ( i in myquery ) {
      st['Contact'].append( i );
    }
dump(st);


st['Contact']=[]; 
for (i = 1; i <= myquery.recordCount; i++) {
    st['Contact'][i]['ID'] = myquery.id[i];
    st['Contact'][i]['Name'] = myquery.name[i];
    st['Contact'][i]['Email'] = myquery.email[i];
}
dump(st);