2011-12-08 7 views
3

私は、同時に作成されるサブモデルmySubModelの束に1対多の関係で作成している新しいモデルmyModelを持っています。cfWheels - オブジェクトに関連するオブジェクトを作成する

私がモデルを保存しよう:唯一のモデルの一部が保存されます

<cfset myModel=model("myModel").new(params.mymodel)> 
<cfset myModel.save()> 

、params.myModel.mySubModels内の項目は作成されません。モデルには関係が設定されていて、右の数値をmyModelから外して同じ形式のデータを取得できます。

私はそれぞれのモデルを別々に保存することができましたが、問題を引き起こすか、またはcfwheelsがこれをすでに処理できる場合は針のコード行を作成することが心配です。最初のモデルを保存してから追加のサブモデルを保存し、エラーがある場合は、既にデータベースに書き込まれているモデルと他のサブモデルを削除する必要があります。

+0

サブモデルはどのように関連付けられていますか? 'hasOne'または' belongsTo'またはその両方ですか? –

+0

'モデルhasMany(サブモデル)'と 'サブモデルbelongsTo(モデル)' – Daniel

答えて

3

メインオブジェクトがhasManyのサブオブジェクトに関連する限り、Nested Propertiesは貴重なものです。メインモデルで

function init() { 
    hasMany("subModels"); 
    nestedProperties("subModels"); 
} 

そして、コントローラの実行中にsave()への呼び出しは、親オブジェクトとそれに関連するすべての子に保存されます。

function create() { 
    myModel = model("myModel").new(params.myModel); 

    // This call to `save()` saves associated children represented in `params.myModel` too 
    if (myModel.save()) { 
     redirectTo(route="myRoute", success="The model was saved successfully."); 
    } 
    else { 
     flashInsert(error="There was an error saving the model."); 
     renderPage(action="new"); 
    } 
} 

特定のデータ構造について詳しくご意見をお寄せいただければ、フォームの一部をお手伝いします。 "subModel"を呼び出すことは、このディスカッションでこれまでのところ私たちを得ることに過ぎません。

+0

Chrisさん、ありがとうございました。モデル内にnestedPropertyがありませんでした。 – Daniel

+0

はい、ありがとうChris - 私はしばらくの間、車輪を使用しましたが、実際にその機能に気づいていませんでした。知っておいてよかった。 –

+0

サブモデル検証エラーのためにフラッシュメッセージを取得して表示する方法はまだよく分かっていません。さあ、 'errorMessagesFor'を使うことができますか? – Sergii

0

私はここでドキュメントを見ています:http://cfwheels.org/docs/1-1/chapter/associations特に、 "hasMany()"に関するセクション。私は親レコードに基づいて新しい子レコードを作成するためのいくつかの関数を見ていますが、それは一度に複数を作成するものはありません。最高で、これはあなたのできることだと思われます:

<cfset myModel=model("myModel").create(params.mymodel)> 

<cfloop array="#params.mymodel.mySubModels#" index="thisSubModel"> 
    <cfset myModel.createMySubModel(thisSubModel)> 
</cfloop> 

これは本当に悪くはないようです。

0

私はこのようなモデルのinitで2つのメソッドを定義します:

validate(methods="validateChildren"); 
afterCreate(methods="createChildren"); 

validateChildrenは、(もちろん、モデルの対応で定義された)それぞれの子モデルの検証を実行し、この目的のためにvalidを使用して検討します - データを保存せずに検証を実行します。親モデルのレベルにエラーを渡すために、このような

使用構文:

addError(property="someproperty", message="Something wrong happened"); 

エラーがない場合は、createChildren方法は、安全なデフォルトを上書きするparamsを使用して、必要なすべてのサブモデルを作成します。個人的には、外部データに頼ることはそれほど良い考えではなく、データを混乱させる可能性があるため、パラメータをループすることはしません。

+0

私はこの答えが落ちた理由を理解しています:フレームワークオブジェクトモデルの力を適切に使いませんが、少なくともすべてのサブモデル警告を簡単に。 – Sergii

関連する問題