首页 > 解决方案 > laravel 中的关卡系统

问题描述

设计具有以下功能的关卡系统:无预警的天数、在此期间赚到的钱、订单数量、评级响应率……每个关卡都有其一个要求,但如何设计其数据库架构和关系

public function level(){
 return $this->hasOne(Level::class);
}

数据库表:

表:

Level_table: 
 id,name

User_table:
id,level_id,user_rating

标签: phpmysqllaravel

解决方案


有两种流行的方法可以解决这个问题。虽然您提供了许多指标(订单、评级、持续时间、收入),但让我们将示例简化为“积分”。

第一个场景是一个公式化的水平系统,你的点概念构成一个阈值,可以动态计算。例如,>10 点始终为“银”。如果你有能力在你的系统中丢分,那么你可以在这个模型中低于银牌。

第二个是更以事件为中心的模型,其中更改阈值可以更改您的级别,但还原不会降低您的级别。这更像是您积分的“赛季最佳”得分。

我最初的想法是代码的复杂性来自级别的计算,而不是存储(因此不一定在您的模型中)。

您如何对此进行建模在很大程度上取决于取决于您的级别或分数的事物。一些探索性的问题是:

  1. 级别会影响计费等事情吗?访问服务或功能怎么样?了解这一点会影响你如何连接到 Laravel 的授权代码(验证器、路由访问等)。
  2. 您的级别公式是否适合第一个或第二个场景(人们可以返回一个级别)。这可以帮助您确定是要存储关卡还是总是计算它(并且可能缓存它......)。
  3. 你的关卡系统会衰减吗?对于您的用户警告示例,这些警告是否会在一个月内“衰减”,并且如果它们太旧则不考虑在内?这有助于您决定对评分算法的输入数据进行任何适当的缓存或过滤。

我最初的直觉是将“状态”字段映射到您的主要实体或模型。例如,您的用户模型可能有一个level字段。然后,您的关卡字段中的转换可以由状态机处理(做一些进一步的谷歌搜索),该状态机会影响您的所有计算和评分算法。或者,您可以将其作为模型上的自定义访问器并动态计算它。

鉴于我最初的直觉,我会简单地拥有一个受保护的字段:

class User {
  //...
  protected $guarded = ['level'];
  // ...
}

“级别”(作为 API)之间的状态转换的一个很好的例子是查看 Stripe 的账单/发票工作流程。虽然它是一个非常不同的业务领域,但它是一个简单的 API,在工作流状态之间的转换中有很多错综复杂的地方。您可以将这些业务规则作为示例来获取如何构建自己的代码和数据结构的灵感。

最后,你可能想要连接到 Laravel 的事件系统来触发“水平调整”事件,并确保这些水平之间的转换只由一组代码处理(尽量避免在一堆控制器中即时计算水平- 为您服务)。

哦,当您考虑架构时……您是否需要存储某人的关卡历史和通过关卡“过渡”的原因?深思熟虑 =D


推荐阅读