Laravel 中 使用模型作为标志

我最近一直在尝试的一件事是使用模型作为标志,并取得了积极的成果。当你需要以某种方式标记你的一个模型时,你可以在表中添加一个布尔值来指示某种状态。例如,假设你向应用程序添加了一个停用用户的功能。你可以使用如下迁移来更改用户表:

Schema::table('users', function (Blueprint $table) {$table->boolean('is_deactivated')->default(false);
});

太棒了!现在,您可以更新is_deactivated数据库中的列,并 $user->is_deactivated在需要处理用户停用状态时检查代码。这是我刚开始时使用的模式,对于很多用例来说,这非常有效。

使用时间戳作为标志
然而,几年前,我在 Twitter 上看到一条帖子(遗憾的是我记不清是谁写的了,抱歉!)建议我们使用时间戳,而不是布尔标志:

Schema::table('users', function (Blueprint $table) {$table->timestamp('deactivated_at')->nullable();
});

这还有一个额外的好处,就是可以让你看到用户何时被停用,而不需要太多的权衡(除了数据库存储的几个额外字节)。在应用此模式时,我倾向于isDeactivated在我的模型上添加一个方法,以确保代码仍然读起来很好。

public function isDeactivated(): bool
{return $this->deactivated_at !== null;
}

简单标志的限制
在数据库中使用简单标志(无论是布尔值还是时间戳)的缺点是,我们可用的数据非常有限。在第一种情况下,我们对问题只有“是”或“否”的答案,在后一种情况下,则需要添加少量时间戳(如果我们决定再次激活用户,该时间戳将被删除)。

但是如果我们需要知道是谁停用了用户怎么办?当然,我们可以添加类似这样的内容 deactivated_by,在大多数情况下,这样就可以了。但也许我们想附加一个文本字段,执行停用的人可以添加原因或其他内容。

使用模型作为标志
我最近开始探索的解决方案是使用模型作为标志,这其实没什么神奇的。这就像添加一个与您想要标记的模型有关系的新模型一样简单。在上面能够停用用户的示例中,我们可以简单地添加一个Deactivation模型并定义两者之间的关系:

Schema::create('deactivations', function (Blueprint $table) {$table->id();$table->text('reason')->nullable();$table->foreignId('user_id');$table->foreignId('admin_id');$table->timestamps();$table->softDeletes();
});
public function deactivations(): HasMany
{return $this->hasMany(Deactivation::class);
}

现在我们基本上可以添加任何我们想要的数据。通过在停用模型上启用软删除,我们还可以额外获得用户停用和重新激活的历史视图。

我们甚至可以更进一步,使关系多态并将功能提取为Deactivatable特征,从而让我们可以在几乎任何我们想要的模型上使用它。

Schema::create('deactivations', function (Blueprint $table) {$table->id();$table->text('reason')->nullable();$table->morphs('deactivatable');$table->timestamps();$table->softDeletes();
});
trait Deactivatable
{public function deactivations(){return $this->morphMany(Deactivation::class, 'deactivatable');}public function isDeactivated(){return $this->deactivations->exists();}// Additional helper methods
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/29020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

社团管理系统

用Spring Boot、Vue.js和MyBatis实现社团管理系统 温馨提示:项目源代码获取方式见文末 摘要 本文探讨了如何使用Spring Boot作为后端框架,Vue.js作为前端框架,以及MyBatis作为数据库持久层框架,构建一个社团管理系统。该系统旨…

在Ubuntu上配置和设置防火墙UFW

在本文我们学习如何在Ubuntu上配置和设置UFW(防火墙),UFW代表“不复杂的防火墙”,它充当IPTABLES的接口,从而简化了防火墙的配置过程,对于防火墙来说,这是非常困难的。初学者学习和配置防火墙规…

从 PERL 脚本获取输出并将其加载到 MySQL 数据库的解决方案

1、问题背景 有一段 Python 脚本可以调用 Perl 脚本来解析文件,解析后,Perl 脚本会生成一个输出,这个输出将被加载到 Python 脚本中的 MySQL 数据库中。Python 脚本如下: pipe subprocess.Popen(["perl", "./pa…

JSR303校验

校验的需求 前端请求后端接口传输参数,需要校验参数。 在controller中需要校验参数的合法性,包括:必填项校验、数据格式校验等在service中需要校验业务规则,比如:课程已经审核过了,所以提交失败。 servi…

【UML用户指南】-17-对基本行为建模-交互

目录 1、消息的可视化表示 2、对象与角色 3、链和连接件 4、消息 5、序列 6、创建、修改和撤销 7、表示法 8、常用建模技术 8.1、对控制流建模 8.1.1、基于时间的控制流 8.1.2、基于结构的控制流 在任何有意义的系统中,对象都不是孤立存在的,…

Gitlab SSH无法连接但是HTTP可以连接

项目场景: Gitlab在docker中布置好之后测试,发现SSH无法连接但是HTTP可以连接 提示:这是一个无效的源路径 问题描述 http可以识别为git项目,而ssh无法识别成git项目。 原因分析: 三种猜想 端口号被占用 尝试查看…

韩兴国/姜勇团队在《Trends in Plant Science》发表植物根系氮素再分配的观点文章!

氮素是陆地生态系统中的关键限制性营养元素,通过生物固氮和土壤氮供应通常远低高等植物的氮需求。当土壤氮素供应无法充分满足植物茎叶生长需求时,植物会通过自身营养器官(如根或根茎)再分配来实现氮的内部循环和再利用。尽管植物…

SaaS产品运营|一文讲清楚为什么ToB产品更适合采用PLG模式?

在数字化时代,ToB(面向企业)产品市场的竞争愈发激烈。为了在市场中脱颖而出,许多企业开始转向PLG(产品驱动增长)模式。这种模式以产品为核心,通过不断优化产品体验来驱动用户增长和业务发展。本…

RAG未来的出路

总有人喊RAG已死,至少看目前不现实。 持这个观点的人,大多是Long context派,老实说,这派人绝大多数不甚理解长上下文的技术实现点,就觉得反正context越长,越牛B,有点饭圈化 ,当然我并不否认长上下文对提升理解力的一些帮助,就是没大家想的那么牛B而已(说个数据,达到…

2024年ERP软件公司排名前十!

在当今的商业环境中,ERP(企业资源规划)系统已成为企业日常运营不可或缺的一部分。然而,如何在这众多的ERP系统软件中筛选出最适合自己的一款,成为许多企业共同面临的挑战。今天,我将带大家盘点erp软件公司的…

李沐:用随机梯度下降来优化人生!

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 今天我们来聊聊达叔 6 大核心算法之 —— 优化 算法。吴恩达:机器学习的六个核心算法! 梯度下降优化算法是机器…

【初体验 threejs】【学习】【笔记】hello,正方体 3!

前言 为了满足工作需求,我已着手学习 Three.js,并决定详细记录这一学习过程。在此旅程中,如果出现理解偏差或有其他更佳的学习方法,请大家不吝赐教,在评论区给予指正或分享您的宝贵建议,我将不胜感激。 项…

【Python支持多种数据类型及案列】

Python 数据类型教学 Python支持多种数据类型,每种类型有其特定的用途和特点。以下是Python中常见的数据类型及其示例。 1. 基本数据类型 整数(int) 整数是没有小数部分的数字。例如:-2, -1, 0, 1, 2 a 10 b -5 print(type(a)…

多元多项式的特征列与零点的关系定理

下面这个定理来自《计算机代数》6.1三角列与特征列(王东明、夏壁灿著) 【定理】 设 C [ C 1 , … , C r ] \mathbb{C }\left\lbrack C_{1},\ldots,C_{r} \right\rbrack C[C1​,…,Cr​]为多项式组 P ⊂ K [ x ] \mathbb{P \subset}\mathcal{K\lbrack}\…

Java共享台球室无人系统支持微信小程序+微信公众号

共享台球室无人系统 🎱 创新台球体验 近年来,共享经济如火如荼,从共享单车到共享汽车,无一不改变着我们的生活方式。而如今,这一模式已经渗透到了更多领域,共享台球室便是其中之一。不同于传统的台球室&a…

java溯本求源之基础(二十四)之--常见List的实现共同点

兄弟们终于到了上代码讲代码的环节了,之前的一些代码都是小打小闹,现在才是重头戏,今天来简单说说一些集合,首先这些都是基于数组实现的,当然Collections.emptyList不算奥,别犟。剩下的不多墨迹直接上重点&…

从中概回购潮,看互联网的未来

王兴的饭否语录里有这样一句话:“对未来越有信心,对现在越有耐心。” 而如今的美团,已经不再掩饰对未来的坚定信心。6月11日,美团在港交所公告,计划回购不超过20亿美元的B类普通股股份。 而自从港股一季度财报季结束…

Hue Hadoop 图形化用户界面 BYD

软件简介 Hue 是运营和开发 Hadoop 应用的图形化用户界面。Hue 程序被整合到一个类似桌面的环境,以 web 程序的形式发布,对于单独的用户来说不需要额外的安装。

SBT30100VFCT-ASEMI大功率肖特基SBT30100VFCT

编辑:ll SBT30100VFCT-ASEMI大功率肖特基SBT30100VFCT 型号:SBT30100VFCT 品牌:ASEMI 封装:TO-220 最大平均正向电流(IF):30A 最大循环峰值反向电压(VRRM)&#xf…

python 打开exe

python 打开exe 在Python中,可以使用subprocess模块来打开一个exe文件。以下是两种不同的实现方法: 方法一: import subprocess 使用subprocess模块打开exe文件 subprocess.Popen(‘path_to_exe_file.exe’) 方法二: import …