拉拉韦尔的水准仪

时间:2019-12-01 11:30:42

标签: php mysql laravel

设计具有以下级别功能的级别系统:无警告天数,该持续时间内的收入,订单响应率等级...每个级别都有其要求,但是如何设计其数据库模式和关系

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

数据库表:

表格:

Level_table: 
 id,name

User_table:
id,level_id,user_rating

1 个答案:

答案 0 :(得分:1)

您可以通过两种流行的方法来解决此问题。在提供许多指标(订单,等级,持续时间,收入)的同时,让我们将示例简化为“点”。

第一种情况是公式级别的系统,您的积分概念构成一个阈值,可以即时计算。例如,> 10分始终是“银色”。如果您有能力在系统中失去积分,则可以在此模型中躲在白银之下。

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

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

建模的方式很大程度上取决于取决于您的级别或分数的事物。一些探索性的问题是:

  1. 级别会影响结算吗?如何访问服务或功能?知道这一点将影响您如何挂接到Laravel的授权代码(验证器,路由访问等)。
  2. 您的关卡公式是否适合第一种或第二种情况(人们可以向后还原关卡)吗?这可以帮助您确定是要存储级别还是始终计算级别(并可能对其进行缓存...)。
  3. 您的水准仪会衰减吗?对于您的带有用户警告的示例,请在例如一个月,如果他们太老了,不考虑在内吗?这可以帮助您决定对计分算法的输入数据进行适当的缓存或筛选。

我的本​​能是将“状态”字段映射到您的主要实体或模型。例如,您的用户模型可能有一个level字段。然后可以由状态机(进行一些进一步的搜索)来处理您级别字段中的转换,该状态机会影响您所有的计算和评分算法。或者,您可以将其作为模型上的自定义访问器,并即时进行计算。

考虑到我的本能,我将简单地设置一个受保护的字段:

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

“级别”(作为API)之间的状态转换的一个很好的例子是查看Stripe的“帐单/发票”工作流。尽管这是一个非常不同的业务领域,但是它是一个简单的API,在工作流状态之间的转换中有很多 复杂性。您可以参考这些业务规则作为示例,以启发您如何构造自己的代码和数据结构。

最后,您可能想挂入Laravel的事件系统以触发“水平”事件,并确保这些水平之间的转换仅由一组代码处理(请避免在运行过程中即时计算水平)。一堆控制器-将它们整合到您的服务中。

哦,当您考虑架构时...您是否需要存储某人的关卡历史记录以及通过这些关卡“过渡”的原因?令人回味的食物= D