Laravel 中 使用模型作为标志

2024-06-25 1312阅读

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

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
}

 

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]