我有一个使用复合键的嵌套属性的问题。
当我编辑一个模型,有多个嵌套属性的实例(与复合键),并希望更新它有更少的空白,cfWheels不删除那些不再使用,并保持旧的值。是否有一种方法可以强制删除这些而不调用嵌套模型上的delete ?
我一直在做的是删除所有嵌套的属性,然后update()
创建所需的记录,但最大的问题是,当我在两者之间的代码失败时,它只是删除项目,如你所知,这可能非常非常糟糕。
在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;
}
}
}
}
}
不确定这是否会给嵌套组合键带来任何问题。有时候,嵌套属性在"特殊"情况下会显得有些笨拙。
我想你忘了在nestedProperties
中提到allowDelete
属性,默认情况下allowDelete在车轮中设置为false,并且不删除复合键形式表。你必须让它为真。例如,在model中,你必须这样做:
<cfset hasMany(name="campaignlanguages",shortcut="languages", dependent="deleteAll") />
<cfsetnestedProperties(associations="campaignlanguages",allowDelete="true")/>
你可以在这里找到更多的细节