【问题标题】:Is it possible to custom the delete on cascade of CakePHP?是否可以在 CakePHP 的级联上自定义删除?
【发布时间】:2012-09-26 14:03:02
【问题描述】:

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

另一方面,我想删除 Post 的所有 cmets 以及其他数据。

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

谢谢。

【问题讨论】:

  • 如果您已正确构建数据库,则在删除所有相关记录(在本例中为 cmets 和日志)之前,您将无法删除该帖子。您必须破坏参照完整性才能在删除帖子时保留日志。
  • 这就是我遇到的问题。

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


【解决方案1】:

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

当您调用 $this->Post->delete($id, $cascade) the second parameter is a boolean 时,它会显示删除操作是否还应删除任何关联的记录 - 这样 依赖 在 Post 记录上:

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

不会删除任何关联的记录。 @987654322 也是如此@这是您想要设置它不是全局的时候。

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

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

在此示例中,日志记录将在其关联的 Post 记录被删除时被删除。

【讨论】:

    【解决方案2】:

    您可以在使用$this->Post->unbindModel('hasMany' => 'Log')(或$this->unbindModel('hasMany' => 'Log'inside Post 模型)调用删除之前尝试删除关联。

    【讨论】:

    • 一旦删除会重启关联?
    • 它将为剩余的请求解除绑定。如果删除后仍需要关联,可以使用bindModel()重新绑定。
    【解决方案3】:

    如果您的后端是 MySQL,您可以关闭外键检查 (SET FOREIGN_KEY_CHECKS=0;),删除父 Post 及其 cmets,然后重新启用外键检查 (SET FOREIGN_KEY_CHECKS=1;)。 我不推荐这个。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2011-09-14
      • 2015-03-25
      相关资源
      最近更新 更多