2

現在、一部はcfwheelsとそのActive Record ORM(これは素晴らしい)で作業しており、一部は生のcfmlとそのHibernate ORM(これも素晴らしい)で作業しています。

どちらも適切な状況でうまく機能しますが、CF ORMを使用するときに私が最も見逃しているのは、cfwheelsで使用できるmodel.update()メソッドです。このメソッドでは、フォーム構造体をメソッドに渡すだけで、モデルプロパティを使用して要素を構造化し、レコードを更新します。大きなテーブルの更新と保守に非常に適しています。CF ORMでは、レコードを更新する唯一の方法は、各列を個別に設定してから保存することです。これは本当ですか?

cf9ORMにはActiveRecordタイプのupdate()(または同等の)メソッドがあり、それぞれを指定しなくてもオブジェクトを更新および更新するための値を持つ構造体を受け取ることができますか?

たとえば、現在の代わりに:

member = entityLoadByPK('member',arguments.id);
member.setName(arguments.name);
member.setEmail(arguments.email);

CF ORMでこのようなことをする方法はありますか?

member = entityLoadByPK('member',arguments.id);
member.update(arguments);

よろしくお願いします

4

2 に答える 2

1

必要なメソッドとまったく同じメソッドはありませんが、EntityNew()は2番目の引数としてオプションの構造体を取ります。これにより、オブジェクトのプロパティが設定されます。ただし、コードの現在の動作によっては、このメソッドを使用するのは不格好な場合があります。 ORMセッションをフラッシュするときに作成/更新が実行されるかどうかに関係があるかどうかはわかりません。

ORMエンティティがマスターCFCから継承する場合は、そこにメソッドを追加できます。または、関数として1つ記述し、それをオブジェクトに混在させることもできます。

ご存知のとおりですが、update()機能は、サニタイズされていないユーザー入力(raw FORMスコープなど)で使用すると、セキュリティ問題(一括割り当て問題と呼ばれる)の原因となる可能性があります。

于 2012-08-15T10:06:24.377 に答える
1

私のアプリでは、通常、タスクを処理するモデル用に2つのヘルパー関数を作成します。

/*
* Get properties as key-value structure
* @limit Limit output to listed properties
*/
public struct function getMemento(string limit = "") {

    local.props = {};

    for (local.key in variables) {
        if (isSimpleValue(variables[local.key]) AND (arguments.limit EQ "" OR ListFind(arguments.limit, local.key))) {
            local.props[local.key] = variables[local.key];
        }
    }

    return local.props;

}


/*
* Populate the model with given properties collection
* @props Properties collection
*/
public void function setMemento(required struct props) {

    for (local.key in arguments.props) {
        variables[local.key] = arguments.props[local.key];
    }

}

セキュリティを強化するために、変数スコープ内setMementoの存在を確認することは可能ですが、これはnull許容プロパティをスキップします。local.key

だからあなたはmyObject.setMemento(dataAsStruct);それを作って保存することができます。

于 2012-08-15T14:55:47.930 に答える