cfWheels - 创建与对象相关的对象

时间:2011-12-08 04:17:08

标签: coldfusion coldfusion-9 cfwheels

我有一个新模型myModel,我正在创建一个与多个同时创建的子模型mySubModel的一对多关系。

当我尝试保存模型时:

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

只保存模型部件,不会创建params.myModel.mySubModels中的项目。这些模型的关系设置正常,我可以使用相同的格式从myModel中提取相同格式的数据。

我可以单独保存每个模型,但是我担心这会引起问题,或者只是在cfwheels能够处理这个问题的情况下创建针线代码。我必须保存初始模型,然后保存其他子模型,如果有错误,请删除已写入数据库的模型和其他子模型。

3 个答案:

答案 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,因为依赖外部数据并不是一个好主意,并且可能会弄乱这些东西。