我有一个新模型myModel
,我正在创建一个与多个同时创建的子模型mySubModel
的一对多关系。
当我尝试保存模型时:
<cfset myModel=model("myModel").new(params.mymodel)>
<cfset myModel.save()>
只保存模型部件,不会创建params.myModel.mySubModels中的项目。这些模型的关系设置正常,我可以使用相同的格式从myModel
中提取相同格式的数据。
我可以单独保存每个模型,但是我担心这会引起问题,或者只是在cfwheels能够处理这个问题的情况下创建针线代码。我必须保存初始模型,然后保存其他子模型,如果有错误,请删除已写入数据库的模型和其他子模型。
答案 0 :(得分: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”只会让我们到目前为止。
答案 1 :(得分:0)
我在这里查看文档:{{3}}具体来说,与“hasMany()”相关的部分。我看到有几个函数可以根据父记录创建新的子记录,但是没有一个会在一次创建中创建多个子记录。充其量,这似乎是你可以做的:
<cfset myModel=model("myModel").create(params.mymodel)>
<cfloop array="#params.mymodel.mySubModels#" index="thisSubModel">
<cfset myModel.createMySubModel(thisSubModel)>
</cfloop>
这真的不差。
答案 2 :(得分:0)
我会在模型init
中定义两个方法,如下所示:
validate(methods="validateChildren");
afterCreate(methods="createChildren");
validateChildren
将为每个子模型运行验证(当然在相应的模型中定义),考虑使用valid来实现此目的 - 它会在不保存数据的情况下触发验证。
使用这样的语法将错误传递给父模型级别:
addError(property="someproperty", message="Something wrong happened");
然后,如果没有错误createChildren
方法将创建所有需要的子模型,使用params
覆盖安全默认值。就个人而言,我不会使用循环而不是params,因为依赖外部数据并不是一个好主意,并且可能会弄乱这些东西。