手滑不再怕!用Composer和Muffin/Trash为你的CakePHP应用实现优雅软删除

手滑不再怕!用composer和muffin/trash为你的cakephp应用实现优雅软删除

最近在开发一个 CakePHP 项目时,我遇到了一个让人头疼的问题:用户反馈不小心删除了重要数据,急需找回。同时,业务方也提出需求,希望能够保留部分已删除数据的历史记录,以便进行审计和分析。传统的 delete() 方法会直接将数据从数据库中移除,这让数据恢复变得异常困难,甚至不可能,也完全无法满足保留历史记录的需求。我尝试了手动添加 is_deleted 字段,并在每次查询时手动过滤,但这不仅增加了大量的重复代码,还很容易出错,效率低下。

Composer在线学习地址:学习地址

正当我为如何优雅地实现这一功能而苦恼时,我发现了 muffin/trash 这个 Composer 包,它简直是 CakePHP 开发者处理软删除的救星!

告别“真删除”,拥抱“软删除”

“软删除”(Soft Delete)是一种数据管理策略,它不像传统的“硬删除”那样直接从数据库中物理移除记录。相反,它通过在记录中设置一个特定的标记(通常是一个时间戳字段,如 deleted_attrashed),来表示这条记录已被“删除”。这样,数据实际上仍然存在于数据库中,只是在查询时被过滤掉,不再向用户展示。

这种方式的优势显而易见:

立即学习“PHP免费学习笔记(深入)”;

数据安全: 避免了意外删除导致的数据永久丢失,提供了数据恢复的可能性。审计追踪: 能够保留完整的历史记录,方便进行数据审计和分析。用户体验: 类似于“回收站”功能,用户可以更安心地操作数据。

使用 Composer 引入 muffin/trash

muffin/trash 是一个为 CakePHP ORM 表提供软删除支持的插件。通过 Composer,你可以非常方便地将其集成到你的项目中。

首先,在你的 CakePHP 项目根目录下,使用 Composer 安装 muffin/trash

composer require muffin/trash

安装完成后,你需要加载这个插件。最简单的方式是使用 CakePHP 的 shell 命令:

bin/cake plugin load Muffin/Trash

或者,你也可以手动在 src/Application.php 文件的 bootstrap() 方法中添加:

$this->addPlugin('Muffin/Trash');

轻松配置,即刻生效

muffin/trash 的使用非常直观。你只需要在需要软删除功能的 Table 类(例如 UsersTable.php)的 initialize() 方法中,像添加其他行为一样,引入 Trash 行为即可:

// src/Model/Table/UsersTable.phpnamespace AppModelTable;use CakeORMTable;class UsersTable extends Table{    public function initialize(array $config): void    {        parent::initialize($config);        // 启用 Muffin/Trash 行为        $this->addBehavior('Muffin/Trash.Trash');    }}

默认情况下,muffin/trash 会查找名为 deletedtrashed 的可空 DATETIME 字段。如果你的字段名不同,例如 deleted_at,你可以通过配置来指定:

AppMall应用商店 AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56 查看详情 AppMall应用商店

// 在你的 Table 类的 initialize() 方法中$this->addBehavior('Muffin/Trash.Trash', [    'field' => 'deleted_at']);

或者,你也可以在全局的 config/bootstrap.php 中进行配置:

// config/bootstrap.phpuse CakeCoreConfigure;Configure::write('Muffin/Trash.field', 'deleted_at');

配置完成后,当你对这个表执行 delete() 操作时,muffin/trash 会自动将 deleted_at 字段设置为当前时间,而不是真正地删除记录。同时,所有的 find() 查询也会自动过滤掉 deleted_at 字段不为 NULL 的记录,完美实现了软删除!

更多高级用法与功能

muffin/trash 不仅仅是简单地标记删除,它还提供了许多实用的功能来增强你的数据管理能力:

查询被软删除的记录:

onlyTrashed():只查询被软删除的记录。

$trashedUsers = $this->Users->find('onlyTrashed')->all();

withTrashed():查询所有记录,包括被软删除的。

$allUsers = $this->Users->find('withTrashed')->all();

恢复被软删除的记录:

restoreTrash($entity):恢复指定的被软删除记录。

$trashedUser = $this->Users->find('onlyTrashed')->first();if ($trashedUser) {$this->Users->restoreTrash($trashedUser);}

cascadingRestoreTrash($entity):恢复指定记录及其所有关联的被软删除记录。

永久删除记录:

如果你确实需要永久删除某条记录,可以使用 purge 选项:

$this->Users->delete($entity, ['purge' => true]);

或者,清空所有被软删除的记录:

$this->Users->emptyTrash(); // 永久删除所有被软删除的记录

级联软删除:当父级记录被软删除时,你可能希望其关联的子级记录也一并被软删除。只需在 Table 关系中设置 'dependent' => true, 'cascadeCallbacks' => true,并确保 muffin/trash 行为也附加到子级 Table 类上即可。

// 在父级 Table 的 initialize() 方法中$this->hasMany('Comments', [    'dependent' => true,    'cascadeCallbacks' => true,]);

如果你不希望级联软删除,可以设置 'cascadeOnTrash' => false

总结与应用效果

muffin/trash 结合 Composer,为 CakePHP 开发者提供了一个极其优雅和高效的软删除解决方案。它将复杂的软删除逻辑封装成一个简单的行为,极大地减少了开发工作量,提升了代码的可维护性。

通过引入 muffin/trash,我的项目成功解决了以下问题:

数据丢失风险降到最低: 用户不再担心误删操作,数据安全得到极大保障。业务需求灵活满足: 轻松实现数据恢复和历史记录查询,满足了审计和分析的需求。开发效率显著提升: 无需手动编写复杂的过滤和更新逻辑,只需几行配置代码即可搞定。

如果你正在使用 CakePHP,并且还在为数据删除问题而烦恼,那么强烈推荐你尝试 muffin/trash。它将彻底改变你处理数据删除的方式,让你的应用更加健壮、灵活!

以上就是手滑不再怕!用Composer和Muffin/Trash为你的CakePHP应用实现优雅软删除的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/245737.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 03:27:36
下一篇 2025年11月4日 03:28:31

相关推荐

  • 如何用dom2img解决网页打印样式不显示的问题?

    用dom2img解决网页打印样式不显示的问题 想将网页以所见即打印的的效果呈现,需要采取一些措施,特别是在使用了bootstrap等大量采用外部css样式的框架时。 问题根源 在常规打印操作中,浏览器通常会忽略css样式等非必要的页面元素,导致打印出的结果与网页显示效果不一致。这是因为打印机制只识别…

    2025年12月24日
    800
  • Bootstrap 中如何让文字浮于阴影之上?

    文字浮于阴影之上 文中提到的代码片段中 元素中的文字被阴影元素 所遮挡,如何让文字显示在阴影之上? bootstrap v3和v5在处理此类问题方面存在差异。 解决方法 在bootstrap v5中,给 元素添加以下css样式: .banner-content { position: relativ…

    2025年12月24日
    000
  • Bootstrap 5:如何将文字置于阴影之上?

    文字重叠阴影 在 bootstrap 5 中,将文字置于阴影之上时遇到了困难。在 bootstrap 3 中,此问题并不存在,但升级到 bootstrap 5 后却无法实现。 解决方案 为了解决这个问题,需要给 元素添加以下样式: .banner-content { position: relati…

    2025年12月24日
    400
  • Bootstrap 5 如何将文字置于阴影上方?

    如何在 bootstrap 5 中让文字位于阴影上方? 在将网站从 bootstrap 3 升级到 bootstrap 5 后,用户遇到一个问题:文字内容无法像以前那样置于阴影层之上。 解决方案: 为了将文字置于阴影层上方,需要给 banner-content 元素添加以下 css 样式: .ban…

    2025年12月24日
    100
  • HTMLrev 上的免费 HTML 网站模板

    HTMLrev 是唯一的人工策划的库专门专注于免费 HTML 模板,适用于由来自世界各地慷慨的模板创建者制作的网站、登陆页面、投资组合、博客、电子商务和管理仪表板世界。 这个人就是我自己 Devluc,我已经工作了 1 年多来构建、改进和更新这个很棒的免费资源。我自己就是一名模板制作者,所以我知道如…

    2025年12月24日
    300
  • 如何使用 Laravel 框架轻松整合微信支付与支付宝支付?

    如何通过 laravel 框架整合微信支付与支付宝支付 在 laravel 开发中,为电商网站或应用程序整合支付网关至关重要。其中,微信支付和支付宝是中国最流行的支付平台。本文将介绍如何使用 laravel 框架封装这两大支付平台。 一个简单有效的方法是使用业内认可的 easywechat lara…

    2025年12月24日
    000
  • Laravel 框架中如何无缝集成微信支付和支付宝支付?

    laravel 框架中微信支付和支付宝支付的封装 如何将微信支付和支付宝支付无缝集成到 laravel 框架中? 建议解决方案 考虑使用 easywechat 的 laravel 版本。easywechat 是一个成熟、维护良好的库,由腾讯官方人员开发,专为处理微信相关功能而设计。其 laravel…

    2025年12月24日
    500
  • 如何在 Laravel 框架中轻松集成微信支付和支付宝支付?

    如何用 laravel 框架集成微信支付和支付宝支付 问题:如何在 laravel 框架中集成微信支付和支付宝支付? 回答: 建议使用 easywechat 的 laravel 版,easywechat 是一个由腾讯工程师开发的高质量微信开放平台 sdk,已被广泛地应用于许多 laravel 项目中…

    2025年12月24日
    000
  • 使用Laravel框架如何整合微信支付和支付宝支付?

    使用 Laravel 框架整合微信支付和支付宝支付 在使用 Laravel 框架开发项目时,整合支付网关是常见的需求。对于微信支付和支付宝支付,推荐采用以下方法: 使用第三方库:EasyWeChat 的 Laravel 版本 建议直接使用现有的 EasyWeChat 的 Laravel 版本。该库由…

    2025年12月24日
    000
  • 如何将微信支付和支付宝支付无缝集成到 Laravel 框架中?

    如何简洁集成微信和支付宝支付到 Laravel 问题: 如何将微信支付和支付宝支付无缝集成到 Laravel 框架中? 答案: 强烈推荐使用流行的 Laravel 包 EasyWeChat,它由腾讯开发者维护。多年来,它一直保持更新,提供了一个稳定可靠的解决方案。 集成步骤: 安装 Laravel …

    2025年12月24日
    100
  • 如何用 CSS 禁止手机端页面屏幕拖动?

    css 禁止手机端屏幕拖动 在手机端浏览网页时,常常会遇到屏幕拖动导致页面内容错乱或无法操作的情况。为了解决这个问题,可以使用 css 的 overflow 属性来禁止屏幕拖动。 解决方案 针对给定的代码,可以在 元素中添加以下 css 样式: 立即学习“前端免费学习笔记(深入)”; body{ov…

    2025年12月24日
    000
  • 如何禁用手机端屏幕拖动功能?

    解决手机端屏幕拖动问题 在移动设备上,当设备屏幕存在内容超出边界时,可以通过拖动屏幕来浏览。但有时,我们希望禁用这种拖动功能,例如当导航菜单展开时。 实施方法 要禁止屏幕拖动,可以为 body 元素添加 overflow:hidden 样式。这将禁用滚动条并阻止屏幕拖动,无论内容是否超出边界。 以下…

    2025年12月24日
    000
  • 如何用纯 CSS 替代 SCSS 中的 @import?

    如何在 css 中替代 scss 中的 @import 在项目中仅有一个文件使用 scss 的情况下,我们可能希望使用纯 css 来替代它。该 scss 文件通常包含对第三方 css 库的导入,如: /* this file is for your main application css. */@…

    2025年12月24日
    000
  • 如何用 CSS 替代 SCSS 中的 @import?

    用 css 替代 scss 中的 @import 在 scss 文件中,@import 语句用于导入其他 css 文件。然而,如果项目中只有一个文件使用 scss,我们可以考虑使用普通 css 来替代它,从而消除对 sass 和 sass-loader 的依赖。 要使用纯 css 替代 scss 文…

    2025年12月24日
    000
  • 如何用纯CSS替代scss中的@import?

    用纯css替代scss中的@import 在一个包含scss文件的项目中,我们可能需要找到一种方法来用纯css替代掉它。为了消除对scss的依赖,可以使用css中的@import指令。 /css中使用@import 纯css中的@import语法与scss中的类似: 立即学习“前端免费学习笔记(深入…

    2025年12月24日
    000
  • 如何构建一个可重复使用的 CSS 容器元素?

    探索可重复使用的 css 容器元素 在前端开发中,css 容器是一个重要的元素,它为应用程序的内容提供了一个可重复使用的布局和样式基础。让我们探讨一下一个典型容器应该包含哪些核心属性。 通常,一个容器元素仅限于定义页面内容的布局和留白。一些常见的属性包括: padding:设置容器内元素与边框之间的…

    2025年12月24日
    000
  • 什么是可重复使用的 CSS 容器?它包含哪些属性?

    什么是可重复使用的 css container? 容器在 css 中扮演着重要的角色,负责容纳页面内容并控制其布局。一个可重复使用的 container 是一组预定义的样式,可以应用于多个组件,以确保一致性和可维护性。 可重复使用的 container 包含哪些属性? 通常,可重复使用的 conta…

    2025年12月24日
    000
  • Bootstrap 4 表格中如何实现列向右对齐?

    表格对齐问题 在bootstrap 4中构建表格时,有时会遇到列不对齐的问题。本文将介绍一个解决此问题的方法,以实现列向右对齐。 问题: 假设我们有一个带有四列的表格,前两列使用 th 标签作为标题,后两列使用 td 标签表示数据。然而,我们希望后两列数据向右对齐。 解决方法: 要解决此问题,我们可…

    2025年12月24日
    000
  • Bootstrap 表格中如何实现列对齐不一致?

    表格设计中的对齐问题 使用 Bootstrap 框架创建表格时,有时会遇到列对齐不一致的问题。例如,将最后两列向右对齐,以下方法可以解决此问题: 将表格设置为 100% 宽度,以覆盖整个容器。为 1、3、4 列设置固定宽度,以确保这些列的对齐。将 2 列设置为自动宽度(不设置宽度),使其自动填充剩余…

    2025年12月24日
    000
  • 如何使用 CSS 将 HTML 表格中的特定列右对齐?

    表格对齐问题:如何将表格中的特定列右对齐? 在 html 表格中,您可以使用 css 样式来控制内容对齐方式。在这种情况下,要将最后两列向右对齐,可以使用以下步骤: 确保表格为 100% 宽度。这将允许表格占用可用空间的全部宽度。设置需要右对齐的列为固定宽度。这将为列分配一个指定宽度,确保内容始终在…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信