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

时间:2015-10-03 01:13:42

标签: php mysql laravel eloquent status

我需要在mt项目中广泛使用状态。我需要angular.module('app', []) .controller("DBController", function($scope){ $scope.userName = "My Name"; }) usersactive等),实体(suspendedactivepending_activation)和我的{}订阅(inactiveactiveon_grace_periodnot_subscribed)。

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

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

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 中。我应该只为订阅表添加DB列并存储应用程序指示的内容,甚至可以创建一个单独的表status并在{{subscription_statuses foreign_key 1}}表?

5 个答案:

答案 0 :(得分:16)

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

class EventStatus
{
    const CANCELLED = 'EventCancelled';
    const POSTPONED = 'EventPostponed';
    const RESCHEDULED = 'EventRescheduled';
    const SCHEDULED = 'EventScheduled';
}
然后我可以做这样的检查:

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

我通常也会为我的模型添加便利方法:

class Event extends Model
{
    public function isCancelled()
    {
        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',
];

答案 1 :(得分:6)

我不同意其他答案。您的状态信息应存储在数据库中。设计良好的数据库应该清晰可用,无需应用程序。如果您决定使用此数据库为移动应用程序提供支持,会发生什么?您将从数据库中获取一些信息并仅将其存储在Laravel中,这意味着您必须在移动应用程序中复制该状态列表,并将其保留在两者之间。

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

选项1

如果您的用户只能拥有一个状态,那么您应该使用值为enumsubscribedsubscribed-gracenot-subscribed的{​​{1}}字段

这在您的观点中同样简单:

never-subscribed

选项2

但是,如果您可能有多种状态,那么您几乎肯定会为每种状态设置单独的字段,并使用@if($user->subscription->status == 'subscribed' 来存储TINYINT1

单独的状态表?

除非您预计可能会添加更多状态,否则我无法看到使用单独状态表的充分理由,即使您要添加更多状态,也可以向0添加新值或添加新值字段取决于适合的选项。

如果您打算在除用户之外的数据库中使用许多其他表的状态,那么状态表将是理想的。

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

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

答案 2 :(得分:4)

在我的应用程序中,我的做法类似于@Martin Bean,除了我不为状态创建单独的类,我将它存储在现有的类/ Model中。

我打电话给usersubscriptionentity 实体

  • 实体在其数据库中的模型和表格中存在status
  • 每个模型都有status可能值的常量,如ACTIVEINACTIVEPENDING等,每个模型可能会有所不同。
  • 创建处理方法,例如getStatusLabel()listStatus()isActive()isX()等。
  • 只有在真的有必要时才会创建isActive/X(),可能是模型有4个状态,但您只对一个特定进行比较,因此我只为该状态创建一个isX()。< / LI>

实施例

class User
{
    const STATUS_ACTIVE    = 1;
    const STATUS_SUSPENDED = 2;
    const STATUS_INACTIVE  = 3;

    /**
     * Return list of status codes and labels

     * @return array
     */
    public static function listStatus()
    {
        return [
            self::STATUS_ACTIVE    => 'Active',
            self::STATUS_SUSPENDED => 'Suspended',
            self::STATUS_INACTIVE  => 'Inactive'
        ]
    }

    /**
     * Returns label of actual status

     * @param string
     */
    public function statusLabel()
    {
        $list = self::listStatus();

        // little validation here just in case someone mess things
        // up and there's a ghost status saved in DB
        return isset($list[$this->status]) 
            ? $list[$this->status] 
            : $this->status;
    }

    /**
     * Some actions will happen only if it's active, so I have 
     * this method for making things easier.
     * Other status doesn't have a specific method because
     * I usually don't compare agains them
     * @return Boolean
     */
    public function isActive()
    {
        return $this->status == self::STATUS_ACTIVE;
    }
}

答案 3 :(得分:1)

每种方法都有优点和缺点。了解每一个都很好。

- 优点和缺点(AJReading&#39;方法):

  • 添加和维护表SEEMS繁琐
  • 只是拥有另一张桌子和模型可以让我们的代码感觉更混乱(不是说它是一个很好的理由不使用它只是说它有点真实)
  • 当我们让应用程序逻辑依赖于数据库中的某些东西时会变得很尴尬(数据库中的东西感觉它们应该是可变的,当我们根据它们需要应用程序逻辑时)
  • 现在我们有迁移,但在他们之前,这些曾经是开发人员存在的祸根(他们会在服务器之间进行切换,因为你必须记住添加新的状态或者你的应用程序会崩溃)...你会不得不对任何数据库更改执行此操作,但这些仍然是我必须最常做的事情
  • 有利于数据完整性

使用常量:优点/缺点(Martin Bean&#39;方法):

  • 避免上述缺点
  • 这些很容易在
  • 上的代码和基本逻辑中引用
  • 你甚至不必创建新的模型或表格(他在他的例子中做了,但你也可以把它们放在事件模型中)。
  • 他们非常适合仅在幕后使用的价值
  • 他们减少了查询量
  • 他们感觉不像是在做多少工作。它们似乎更容易重构。
  • Con:当你开始标记它们,检索它们,获取描述等时,它们会变得有点尴尬。翻译解决方案很好但是如果你不在你的应用程序中使用翻译那么这就是有点尴尬。
  • 最终他们打破了你的ORM流程。如果你所有的其他型号都扩展了Eloquent,那么这会使模具断裂一些。
  • 对如何做到这一点没有真正的一致意见。很多人每次都使用不同的方法。
  • 像AJReading所说的那样,如果你需要单独使用数据库来实现项目的另一个方面,那就无法工作

我使用常量方法,但有时我认为如果我使用表格,我的代码可能会更清晰,更简单。这是一个艰难的电话。我希望有一个记录良好的解决方案,用于恒定方法,至少可以创建一致性,但我还没有见过。无论哪种方式,我都不认为这是正确或错误的答案。选择一个并继续使用它!

答案 4 :(得分:0)

对于这种性质的决定,请问自己:

  

“我的应用程序是否会有一个实例   感觉这些常数有不同的价值吗?“

e.g。测试环境,某种克隆,一些尚未定义但可能的未来版本......

如果该问题的答案为“是”,那么它应该可以进入应用程序配置。

如果不太可能,(或愚蠢)让值发生变化,它们属于,应该进入模型。

我建议在这种情况下,没有明智的理由让应用程序的版本具有不同的值,所以我将它放在模型中。