通过CFLOOP将变量动态设置为结构

时间:2013-04-21 05:48:40

标签: coldfusion cfml

我试图通过CFLOOP动态地将变量设置到结构中。我看过Ben Nadal's博文,但似乎无法正确完成作业。我想使用点表示法,并使VIN成为值的子结构。

这是我的代码:

<cfloop query="VINs">
    <cfquery name="carsQue" datasource="carsData">
      SELECT VIN, MODEL, MAKE, etc
      FROM CarsDB
      WHERE (VIN = #VIN#)
    </cfquery>

     <cfset carsStruct= StructNew()>
     <cfset carsStruct.[VIN].MAKE = '#carsQue.MODEL#'>
     <cfset carsStruct.[VIN].MODEL = '#carsQue.MAKE#'>
</cfloop>

非常感谢任何指导,

由于

3 个答案:

答案 0 :(得分:4)

在循环外创建一个结构,并在循环中设置变量可以解决问题。在当前场景中,每次循环运行时都会创建一个新结构。

你可以做这样的事情

 <cfset carsStruct= StructNew()>
 <cfloop query="VINs">
   <cfquery name="carsQue" datasource="carsData">
   SELECT VIN, MODEL, MAKE, etc
   FROM CarsDB
   WHERE VIN = <cfqueryparam cf_sql_type="cf_sql_varchar" value="#VINs.VIN#">
   </cfquery>

   <cfset carsStruct[VINs.VIN].MAKE = carsQue.MODEL>
   <cfset carsStruct[VINs.VIN].MODEL = carsQue.MAKE>
 </cfloop>

答案 1 :(得分:4)

在循环中运行查询几乎总是一个坏主意。在您的情况下,更好的选择是:

<cfif ListLen(valuelist(vins.vin)) gt 0>
<cfquery name=CarsQue datasource = "carsData">
select vin, model, make, etc
from carsDB
where vin in (<cfqueryparam cfsqltype="cf_sql_varchar"
value="#valuelist(vins.vin)#" list="true">)
</cfquery>

<cfset carsStruct = StructNew()>

<cfloop query="carsQue">
code for your struct
</cfloop>

<cfelse>
code for vins query returning no data
</cfif>

更好的是用一个查询获取所有数据。您没有提供足够的信息来确定这是否可行,但通常是。

答案 2 :(得分:2)

根据您提供的有限信息,您应该能够运行一个查询并循环遍历该查询以添加到您的结构中。

<cfset carsStruct= {}> //new struct
<cfif VINs.RecordCount> //your VINs query has records
  <cfquery name="carsQueue" datasource="carsData">
  SELECT VIN, MODEL, MAKE, etc
  FROM CarsDB
  // Quoted list of all your VINs. cfqueryparam prevents against SQL injection 
  WHERE VIN IN (<cfqueryparam cf_sql_type="cf_sql_varchar" value="#ValueList(VINs.VIN)#" list="true">
  </cfquery>


  <cfloop query="carsQueue">
    <cfset carsStruct.[carsQueue.VIN].MAKE = carsQueue.MODEL>
    <cfset carsStruct.[carsQueue.VIN].MODEL = carsQueue.MAKE>
  </cfloop>
<cfelse>
   // if VINs query return nothing a blank struct will be returned.
   //You do NOT need this <cfelse> unless you are returning something when the query is blank
</cfif>