Laravel - 在哪里存储状态(标志)?模型、类或配置文件夹?

2022-08-30 14:34:21

我需要在mt项目中广泛使用状态。我需要它们用于我的(,等),实体(,,)和我的订阅(,,,)。。usersactivesuspendedactivepending_activationinactiveactiveon_grace_periodnot_subscribednever_subscribed

到目前为止,我认为最好的方法是将它们存储在数据库中,但我有一种感觉,将它们放在其他3个选项中要容易得多。

我还认为我可以将它们作为常量存储在我的模型中。例如,我的订阅模型将如下所示:Eloquent

// SubscriptionModel
const SUBSCRIBED_ACTIVE = 1;
const SUBSCRIBED_ON_GRACE_PERIOD = 2;
const NOT_SUBSCRIBED = 3;
const NEVER_SUBSCRIBED = 4;

并检索它们,例如在边栏选项卡视图中:

// subscription/index.blade.php
@if($user->subscription->status == /App/SubscriptionModel::SUBSCRIBED_ACTIVE)
    <div>You are subscribed. Thank you</div>
@elseif($user->subscription->status == /App/SubscriptionModel::NEVER_SUBSCRIBED)
    <div>You need to create a subscription before being granted full access!</div>
@elseif(...)
    // and so on

如何做同样的事情,但使用配置文件夹并添加一个名为 的文件。在视图中访问它就像这样:status.php

@if($user->subscription->status == Config::get('status.subscription.SUBSCRIBED_ACTIVE'))
<div>You are subscribed. Thank you</div>
@elseif(...)
// etc

有没有更好的方法?

另外,等式的另一部分怎么样,这意味着存储在.我是否应该只为订阅表设置一列,并存储应用程序指示的内容,甚至 bettter 是否应创建一个单独的表并在表中包含?DBstatussubscription_statusesforeign_keysubscription_status_idsubscriptions


答案 1

我倾向于为状态创建一个特定的模型,作为枚举。因此,如果我有一个模型,我可能有一个相应的模型,如下所示:EventEventStatus

class EventStatus
{
    public const CANCELLED = 'EventCancelled';
    public const POSTPONED = 'EventPostponed';
    public const RESCHEDULED = 'EventRescheduled';
    public const SCHEDULED = 'EventScheduled';
}

然后,我可以像这样进行检查:

$event->status === EventStatus::CANCELLED;

我通常也会在我的模型中添加方便的方法:

class Event extends Model
{
    public function isCancelled(): bool
    {
        return $this->status === EventStatus::CANCELLED;
    }
}

对于“人性化”字符串,我将有一个包含文本字符串的语言文件:

<?php // resources/lang/en/event_status.php

return [
    EventStatus::CANCELLED => 'Cancelled',
    EventStatus::POSTPONED => 'Postponed',
    EventStatus::RESCHEDULED => 'Rescheduled',
    EventStatus::SCHEDULED => 'Scheduled',
];

答案 2

我不同意其他答案。您的状态信息应存储在数据库中。一个设计良好的数据库应该是清晰的,并且在没有应用程序的情况下可用。如果您决定使用此数据库来为移动应用程序之类的东西提供支持,会发生什么情况?您将从数据库中获取一些信息,并将其仅存储在Laravel中,这意味着您还必须在移动应用程序中复制该状态列表,并在两者之间维护它。

此类信息应存储在数据库中。

备选案文1

如果您的用户只能有一种状态,则应使用具有值 、 的字段enumsubscribedsubscribed-gracenot-subscribednever-subscribed

这在您的视图中同样简单:

@if($user->subscription->status == 'subscribed'

备选案文2

但是,如果您可能有多个状态,则几乎可以肯定的是,每个状态都应该有一个单独的字段,并使用 a 来存储 或 。TINYINT10

单独的状态表?

我看不出有充分的理由使用单独的状态表,除非您预计可能会添加更多状态,即使您要添加更多状态,也可以根据哪个选项适合向中添加新值或添加新字段。enum

如果您计划将状态用于数据库中除用户之外的许多其他表,则状态表将是理想的选择。

使用单独的状态表的唯一其他原因是,如果您决定更改特定状态的含义。这意味着您可以在状态表中重命名状态,但用户仍将通过其主键链接到它。使用前两种方法更改状态的含义将涉及对结构的更改。

这实际上取决于您预期您将如何使用它们,但是没有理由不将它们保留在数据库中。


推荐