0

使用 cake 2.x 我有 3 个表(我已经缩短了这个例子的名称,删除了复数/单数 cakephp 约定):

  1. Main(有许多 Sub1)
  2. Sub1(属于main,有很多Sub2)
  3. Sub2(属于 sub1)

当我从 Main 中删除一个类别时,使用 $this->Main->delete($id, true) 调用正确删除其所有相关的 sub1/sub2 项目。

但是我不确定如何从 Sub1 中删除一个项目并删除它的所有 sub2 属性。控制器需要操作表的所有三个级别。我试过了:

$this->loadModel('Sub1');
$res = $this->Sub1->delete($id, true);

但它没有将模型绑定到 Sub2 并删除它们。在蛋糕中做这种事情的正确惯例是什么和/或我做错了什么?

4

1 回答 1

1

我建议检查两件事:

1) 检查是否dependent为 BOTH 关联设置为 true,即 Main 中的 $hasMany 和 Sub1 中的 $hasMany

2) 检查在这些关联中的任何一个中,'exclusive' 是否未设置为 true。来自食谱:

当 Exclusive 设置为 true 时,递归模型删除使用 deleteAll() 调用进行删除,而不是单独删除每个实体。这极大地提高了性能,但可能并不适用于所有情况。

如果两个关联dependent都是 true 和exclusivefalse,那么 Cake 应该递归地删除您的关联,正如您从源代码中看到的那样。

最后,请记住一些小技巧,尽管它们与您当前的问题无关:

a)
在您从控制器提供的代码片段中,您不需要加载 Sub1 模型。它已经可用。所以你可以打电话:

$res = $this->Main->Sub1->delete($id, true);

b) 无需作为方法中true的第二个参数传入delete,因为它的默认值已经是true. 见http://book.cakephp.org/2.0/en/models/deleting-data.html

c) 我显然不知道你的 main、sub1 和 sub2 模型之间的具体区别是什么。但是,如果它们本质上是相同的,而您只是想跟踪层次结构,则应该研究Tree Behavior

于 2013-08-16T04:41:55.057 回答