0

我遇到了使用复合键的嵌套属性的问题。

当我正在编辑具有多个嵌套属性实例(使用复合键)的模型并希望通过将它们留空来更新它以减少它们时,cfWheels 不会删除不再使用的那些,并保持旧值. 有没有办法强制删除这些而不在嵌套模型上调用 delete?

我一直在删除所有嵌套属性,然后update()创建所需的记录,但最大的问题是,当我在两者之间有代码失败时,它只会删除项目,如你所知,这可能非常很坏。

4

2 回答 2

1

我认为您忘记在轮子中将默认allowDelete属性nestedPropertiesallowDelete 设置为 false 并且不会删除复合键表单表。您必须将其设置为 true。例如在模型中你必须做这样的事情。

   <cfset hasMany(name="campaignlanguages",shortcut="languages", dependent="deleteAll") />
   <cfsetnestedProperties(associations="campaignlanguages",allowDelete="true")/>

你可以在这里找到更多细节

于 2013-05-02T13:32:55.573 回答
1

在您的init呼叫中nestedProperties(),尝试添加allowDelete选项:

nestedProperties(association="comments", allowDelete=true);

然后,如果该集合中的模型有一个名为的属性_delete设置为true,则 CFWheels 将删除该记录。

我不确定您的模型,因为您的问题中没有包含任何详细信息,但您可能会运行一个beforeValidationOnUpdate回调来检查嵌套模型的标准并设置_delete = true何时需要删除记录。

例如:

// Post.cfc
component extends="Model" {
  function init() {
    hasMany("comments");
    nestedProperties(association="comments", allowDelete=true);
    beforeValidationOnUpdate("removeBlankComments");
  }

  private function removeBlankComments() {
    if (StructKeyExists(this, "comments") && IsArray(this.comments)) {
      for (local.i = 1; local.i < ArrayLen(this.comments); local.i++) {
        if (!Len(this.comments[local.i].message)) {
          this.comments[local.i]._delete = true;
        }
      }
    }
  }
}

不确定这是否会给嵌套复合键带来任何问题。有时嵌套属性在“特殊”情况下有点笨拙。

于 2013-05-02T13:36:17.633 回答