[英]Level system in laravel [closed]
设计具有以下功能的关卡系统:无警告天数、在该期间赚取的金钱、评级响应率的订单数量……每个级别都有其一个要求,但如何设计其数据库架构和关系
public function level(){
return $this->hasOne(Level::class);
}
数据库表:
表格:
Level_table:
id,name
User_table:
id,level_id,user_rating
有两种流行的方法可以解决这个问题。 虽然您提供了许多指标(订单、评级、持续时间、收入),但让我们将示例简化为“积分”。
第一个场景是公式化的级别系统,其中您的分数概念构成了一个阈值,并且可以即时计算。 例如,>10 分总是“银”。 如果你有能力在你的系统中丢分,那么你可以在这个模型中低于白银。
第二种是更加以事件为中心的模型,其中更改阈值可以更改您的级别,但还原不会降低您的级别。 这更像是您的积分的“赛季最佳”得分。
我最初的想法是,您代码的复杂性来自关卡的计算,而不是存储(因此不一定在您的模型中)。
您如何对此进行建模在很大程度上取决于取决于您的级别或分数的事物。 一些探索性的问题是:
我最初的直觉是将“状态”字段映射到您的主要实体或模型。 例如,您的 User 模型可能有一个level
字段。 然后可以通过状态机(做一些进一步的谷歌搜索)处理级别字段中的转换,该状态机将您的所有计算和评分算法考虑在内。 或者,您可以将其作为模型上的自定义访问器并即时计算。
鉴于我最初的直觉,我想拥有一个受保护的字段:
class User {
//...
protected $guarded = ['level'];
// ...
}
“级别”之间的状态转换(作为 API)的一个很好的例子是查看 Stripe 的账单/发票工作流。 虽然它是一个非常不同的业务领域,但它是一个简单的 API,在工作流状态之间的转换中有很多错综复杂的地方。 您可以将这些业务规则作为示例,以了解如何构建自己的代码和数据结构。
最后,您可能希望连接到 Laravel 的事件系统来触发“调平”事件,并确保这些级别之间的转换仅由一组代码处理(尽量避免在一堆控制器之间动态计算级别- 在您的服务中将这一切结合在一起)。
哦,当您考虑模式时……您是否需要存储某人的级别历史记录和“过渡”级别的原因? 深思熟虑=D
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.