1

ORMの更新機能をカスタマイズしたい。デフォルトでは、ORM は更新が必要なオブジェクトをロードし、更新を行ってからオブジェクトを保存します。特定の条件が満たされたときにレコードを更新したい。

例えば ​​:

ここに画像の説明を入力

支払い方法をクレジットカードから現金に変更したい。記録を更新する前に、すでに現金支払いモードがあることを確認したいと思います。存在する場合は、レコードを更新する必要はありません。そうでない場合は、レコードを更新します。

上記のチェックには、次の SQL を使用しました。

SELECT COUNT(*) 
FROM hr_lookup_paymentmode 
WHERE PaymentMode = 'cash' 
  AND modeid <> '10'   

同等の HQL:

/**
    * @hint Determines total number of results with same value of search for update purposes.
    */
remote numeric function searchUpdateCount(string q,numeric modeid ) output="false" {

var hqlString = "";
var whereClause = "";
var params = {};
hqlString = hqlString & "SELECT count(*) ";
hqlString = hqlString & "FROM hr_lookup_paymentmode";
if (len(arguments.q) gt 0)
{
    whereClause  = ListAppend(whereClause, " PaymentMode = '#arguments.q#'", "|");
    whereClause  = ListAppend(whereClause, "modeid <> '#arguments.modeid#'", "|");
    whereClause = Replace(whereClause, "|", " AND ", "all");

}


if (len(whereClause) gt 0){
    hqlString = hqlString & " WHERE " & whereClause;
}
return ormExecuteQuery(hqlString, false, params)[1];
}

パラメータq = 'cash'modeid = 10. 見つかったカウントが 0 より大きい場合は、レコードが既に存在することを意味し、それ以外の場合は更新を行います。

このロジックを適用するのを手伝ってください。

4

1 に答える 1

4

グローバルに定義された、または特定の ORM オブジェクトで定義された ORM イベント ハンドラーを使用できます。イベント ハンドラーに関する情報を次に示しますが、基本的には ORM オブジェクトで次のことを行います。

function preUpdate( obj, data ){
   {do stuff here }
}

この例objは、保存しようとしているdataORM エンティティであり、ORM エンティティからの古いデータを含む構造です。関数の本体にロジックを追加するだけです。

于 2013-08-13T12:19:11.307 に答える