我遇到了使用复合键的嵌套属性的问题。
当我正在编辑具有多个嵌套属性实例(使用复合键)的模型并希望通过将它们留空来更新它以减少它们时,cfWheels 不会删除不再使用的那些,并保持旧值. 有没有办法强制删除这些而不在嵌套模型上调用 delete?
我一直在删除所有嵌套属性,然后update()
创建所需的记录,但最大的问题是,当我在两者之间有代码失败时,它只会删除项目,如你所知,这可能非常很坏。
我遇到了使用复合键的嵌套属性的问题。
当我正在编辑具有多个嵌套属性实例(使用复合键)的模型并希望通过将它们留空来更新它以减少它们时,cfWheels 不会删除不再使用的那些,并保持旧值. 有没有办法强制删除这些而不在嵌套模型上调用 delete?
我一直在删除所有嵌套属性,然后update()
创建所需的记录,但最大的问题是,当我在两者之间有代码失败时,它只会删除项目,如你所知,这可能非常很坏。
我认为您忘记在轮子中将默认allowDelete
属性nestedProperties
allowDelete 设置为 false 并且不会删除复合键表单表。您必须将其设置为 true。例如在模型中你必须做这样的事情。
<cfset hasMany(name="campaignlanguages",shortcut="languages", dependent="deleteAll") />
<cfsetnestedProperties(associations="campaignlanguages",allowDelete="true")/>
你可以在这里找到更多细节
在您的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;
}
}
}
}
}
不确定这是否会给嵌套复合键带来任何问题。有时嵌套属性在“特殊”情况下有点笨拙。