我有一个表需要更新,其中所有列都可以选择传递给方法。
然后我使用ColdFusion检查每个列是否已通过并将其添加到更新查询中。
最好的方法是什么?我不能总是更新user_id字段,因为它是一个标识字段。是否有类似于设置1 = 1的东西,就像我在下面那样可以工作?问题只在于逗号导致语法错误。
感谢您的帮助。
update users
set 1 = 1
<cfif len(arguments.userType)>,user_type = #arguments.userType#</cfif>
<cfif len(arguments.primaryGroupId)>,primary_group_id = #arguments.primaryGroupId#</cfif>
<cfif len(arguments.email)>,email = '#arguments.email#'</cfif>
<cfif len(arguments.password)>,password = '#arguments.password#'</cfif>
<cfif len(arguments.firstName)>,first_name = '#arguments.firstName#'</cfif>
<cfif len(arguments.lastName)>,last_name = '#arguments.lastName#'</cfif>
<cfif len(arguments.status)>,status = '#arguments.status#'</cfif>
<cfif len(arguments.languageId)>,language_id = #arguments.languageId#</cfif>
<cfif len(arguments.gmtOffset)>,gmt_offset = '#arguments.gmtOffset#'</cfif>
where user_id = #arguments.userId#
答案 0 :(得分:4)
如果您正在更新,并且未传递参数,则只需将其设置为当前值。
update users
set
user_type = <cfif len(arguments.user_type)>#arguments.userType#<cfelse>user_type</cfif>
,primary_group_id = <cfif len(arguments.primaryGroupId)>#arguments.primaryGroupId#<cfelse>primary_group_id</cfif>
,email = <cfif len(arguments.email)>'#arguments.email#'<cfelse>email</cfif>
where user_id = #arguments.userId#
答案 1 :(得分:2)
嗯......你可以计算你做的更新次数。这将“修复”上面的查询。如:
<cfset updCt = false/>
<cfif len(arguments.usertype)>, user_type = #arguments.userType#
<cfset updCt = true/>
</cfif>
<cfif len(arguments.primaryGroupID)>
<cfif updCt>,</cfif>
primary_group_id = #arguments.primaryGroupID# <cfset updCT = true/>
</cfif>
...你明白了。虽然相当混乱。我想我更有可能确保参数都存在 - 传递未更改的值,以便查询更新整个数据集(或其他)。
答案 2 :(得分:0)
如果您可以将所有参数(除UserID之外)设为可选AND而没有默认值,那么您可以执行以下操作:
<cffunction name="updateUser">
<cfargument name="userID" required="true">
<cfset argumentMap = {field1 = {name="field_1", type="cf_sql_varchar"},
field2 = {name="field_2", type="cf_sql_numeric"},
....} />
<!--- where field1, field2, etc will match the name
of the arguments to your function--->
<cfif arrayLen(structKeyArray(arguments)) gt 1>
<cfquery>
UPDATE users
SET
<cfloop collection="#arguments#" item="arg">
#argumentMap[arg].name# = <cfqueryparam
value="#arguments[arg]#"
type="#argumentMap[arg].type#" />
</cfloop>
WHERE user_id = <Cfqueryparam value="#arguments.userID#" type="cf_sql_numeric"/>
</cfquery>
</cfif>
</cffunction>
这只会执行带有给定参数的UPDATE语句。