是否可以在CakePHP的级联上自定义删除?

时间:2012-09-26 14:03:02

标签: cakephp cakephp-2.0 cakephp-2.1 cascading-deletes cakephp-2.2

我有一个表格,其中包含与Post相关的日志,我不希望删除帖子时删除其数据。

另一方面,我想删除帖子的所有评论以及其他数据。

我一直在看文档,但他们没有说什么: http://book.cakephp.org/2.0/en/models/deleting-data.html

感谢。

3 个答案:

答案 0 :(得分:2)

你可以通过至少两种不同的方式做到这一点。

开启时,您正在调用$this->Post->delete($id, $cascade) the second parameter is a boolean,表明删除操作是否还应删除任何相关记录 - 例如依赖在Post记录中:

$this->Post->delete($id, false);

不会删除任何相关记录。对于$this->Model->deleteAll();也是如此。当您想要将其设置为不是全局时。

取决于非常重要,因为此概念也可以在hasManyhasOne关系的配置中设置,以便这是默认的删除行为:

public $hasMany = array(
    'Log' => array(
        'className' => 'Log',
        'foreignKey' => 'post_id',
        'dependent' => false
    )
);

在此示例中,日志记录将在删除相关的帖子记录后删除 NOT

答案 1 :(得分:0)

您可以尝试删除关联,然后使用$this->Post->unbindModel('hasMany' => 'Log')(或Post模型中的$this->unbindModel('hasMany' => 'Log')调用删除。

答案 2 :(得分:0)

如果您的后端是MySQL,您可以关闭外键检查(SET FOREIGN_KEY_CHECKS = 0;),删除父Post及其注释,并重新启用外键检查(SET FOREIGN_KEY_CHECKS = 1;)。 但我不建议这样做。

我倾向于在帖子上实现'软删除'(给它一个'删除'字段并添加一个索引,当你删除它时你设置为true)并更新你的前端查询以忽略任何帖子删除= 1

有一些软删除行为,但代码实现起来非常简单。