2011-12-08 92 views
3

我有一个新的模型myModel,我创建一对多的关系,同时创建一堆子模型mySubModelcfWheels - 创建一个对象相关的对象

当我尝试保存模型:

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

只有模型的一部分被保存,不要让内部创建params.myModel.mySubModels的项目。模型有他们的关系设置,我可以得到它以相同的格式从myModel拉出数据与正确的包括。

我可以分别保存每个模型,但是我担心会导致问题,或者只是创建了代码行,如果cfwheels已经能够处理这些。我将不得不保存初始模型,然后保存其他子模型,如果出现错误,请删除已写入数据库的模型和其他子模型。

+0

您的子模型如何关联? 'hasOne'或'belongsTo'或两者? –

+0

'model hasMany(submodels)''''sub-model belongsTo(model)' – 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"); 
    } 
} 

如果您可以对您的特定数据结构进行更多评论,我可以帮助您完成表格部分。调用一些“子模型”只会让我们在这个讨论中得到很大的帮助。

+0

非常感谢Chris,我错过了模型中的nestedProperty。 – Daniel

+0

是的,谢谢克里斯 - 我已经使用了一段时间的轮子,但并没有真正注意到这个功能。很高兴知道。 –

+0

好,但仍不清楚如何获取并显示子模型验证错误的Flash消息。说,可以使用'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两种方法,就像这样:

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

validateChildren将运行为每个孩子模型验证(在相应课程的模型,定义),可以考虑使用valid为了这个目的 - 它会触发验证而不保存数据。

这样使用语法错误传递到父模型级别:

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

然后如果没有错误createChildren方法将创建所有需要的子模型,采用params覆盖安全默认值。就我个人而言,我不会使用params来循环,因为依赖外部数据不是那么好的主意,并且可能会混淆这些内容。

+0

我明白为什么这个答案被低估了:它没有正确使用框架对象模型的力量,但至少它允许获取所有的子模型轻松警告。 – Sergii