3

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

当我尝试保存模型时:

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

只有模型部分被保存,params.myModel.mySubModels 中的项目不会被创建。模型有它们的关系设置,我可以让它以相同的格式从myModel正确的包含中提取数据。

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

4

3 回答 3

3

只要主对象与子对象相关hasMany嵌套属性对您来说将是无价的。

在主模型中:

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");
    }
}

如果您可以对您的特定数据结构发表更多评论,我可以在表单部分为您提供帮助。将某些东西称为“子模型”只会让我们在这个讨论中走得更远。

于 2011-12-08T21:05:51.393 回答
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>

这看起来真的没有那么糟糕。

于 2011-12-08T06:27:43.890 回答
0

我会在模型中定义两种方法init,如下所示:

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

validateChildren将为每个子模型(当然在相应的模型中定义)运行验证,考虑为此目的使用valid ——它会在不保存数据的情况下触发验证。

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

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

然后,如果没有错误,createChildren方法将创建所有需要的子模型,params用于覆盖安全默认值。就我个人而言,我不会使用循环参数,因为依赖外部数据并不是一个好主意,而且会弄乱这些东西。

于 2011-12-08T10:03:04.697 回答