5

すべての列がオプションでメソッドに渡されるテーブルを更新する必要があります。

次に、ColdFusion を使用して、各列が渡されたかどうかを確認し、それを更新クエリに追加しています。

これを行う最善の方法は何ですか?user_id フィールドは 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#
4

3 に答える 3

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#
于 2012-06-18T17:45:18.000 に答える
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>

... わかります。かなり面倒ですが。引数がすべてそこにあることを保証する可能性が高いと思います-変更されていない値を渡して、クエリがデータセット全体(または何でも)を更新しているようにします。

于 2012-06-18T17:36:53.340 に答える
0

すべての引数 (UserID 以外) をオプションにしてデフォルト値なしにすることができる場合は、次のようにすることができます。

<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 ステートメントのみを実行します。

于 2012-06-18T18:49:08.943 に答える