我遇到了使用复合键的嵌套属性的问题。
当我正在编辑具有多个嵌套属性实例的模型(使用复合键)并希望通过将它们留空而将其更新为更少时,cfWheels不会删除不再使用的那些,并维护旧的价值。有没有办法在不嵌套模型上调用delete的情况下强制删除这些?
我一直在做的是删除所有嵌套属性,然后update()
创建所需的记录,但最大的问题是当我之间的代码失败时,它只删除项目,你知道这可能非常糟糕。
答案 0 :(得分:1)
我认为您忘记在allowDelete
中提及nestedProperties
属性,因为defalut allowDelete在轮子中设置为false,并且不会删除复合键表格表。你必须把它设置为真。
例如在模型中你必须做这样的事情。
<cfset hasMany(name="campaignlanguages",shortcut="languages", dependent="deleteAll") />
<cfsetnestedProperties(associations="campaignlanguages",allowDelete="true")/>
您可以找到更多详情here
答案 1 :(得分: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;
}
}
}
}
}
不确定这是否会给嵌套复合键带来任何问题。有时嵌套属性对于“特殊”情况有点麻烦。