首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数据库中存储数据与在类中存储数据

在数据库中存储数据与在类中存储数据
EN

Stack Overflow用户
提问于 2015-06-11 01:43:13
回答 2查看 331关注 0票数 1

我正在使用Laravel 4.2构建一个PHP应用程序。该应用程序允许用户访问网站并提交唯一的代码。当代码提交时,他们会得到他们应得的奖励。奖励可以是不同的,比如“下一次购买时打九折”,“免费T恤”,“下次购买时免费送货”等。

我的应用程序中有一个Code模型,它是用户最初提交的唯一代码的模型。因此,应用程序的第一步是检查他们提交的代码,确保它存在于数据库中,然后以他们有资格获得的可能奖励的列表进行响应。

我的第一个想法是有一个Reward模型和一个rewards表来在数据库中存储可用的奖励,然后在用户提交他们唯一的代码后将相关的奖励呈现给用户。在我的模板中类似这样:

代码语言:javascript
复制
<ul> 
    @foreach($rewards as $reward) 
        <li>{{ $reward->name }}</li>
        <li>{{ $reward->value }}</li>
        <li>{{ $reward->redemption_instructions }}</li>
    @endforeach
</ul>

然而,我现在认为将每个奖励设置为它自己的类对我来说实际上会更方便。这样,我就可以根据需要在每个奖励类型中构建尽可能多的自定义功能。例如,每个奖励类都有一个名为display()的方法,该方法将输出必要的html以向用户显示奖励。在这种情况下,我的模板将如下所示:

代码语言:javascript
复制
<ul> 
    @foreach($rewards as $reward) 
        <li>{{ $reward->display() }}</li>
    @endforeach
</ul>

我正在尝试弄清楚如何设置它们,使它们以这样的方式运行。我计划设置类来存储每个奖励所需的信息。例如,其中一个可能如下所示:

代码语言:javascript
复制
class TenPercentOffNextOrderReward {
    private $name = '10% Off Your Next Order';

    private $description = 'Take 10% off your next order on our website!';

    public function createCoupon() {
        // create a coupon for this reward
    }
}

class FreeShirtReward {
    private $name = 'Free T-Shirt';

    private $description = 'Get a free t-shirt!';

    public function sendShirt() {
        // send tshirt to customer
    }
}

所以,正如你所看到的,每种奖励类型都有不同的功能。这是处理这种类型设置的最佳方法吗?我的rewards表应该只存储所有奖励的不同类名吗?我甚至根本不需要rewards表吗?

EN

回答 2

Stack Overflow用户

发布于 2015-06-11 01:50:51

以我的经验,有一个包含任何冗余数据(如姓名、描述等)的表格是更好的做法,因为这也有助于以后能够使用web界面输入新的奖励。然后,应该使用一些服务器端逻辑(就像在上面的类中所做的那样)指定特定于奖励的显示规则,或者只使用某种模板机制并通过存储在中的template_id引用它们。事实上,即使是template_id也可以与匹配的模板一起存储在数据库的查找表中,这样将来也可以对其进行编辑。

因此,我不仅会把它放在数据库中,而且如果你想定制你的显示模板,你可以考虑增强你的数据库来适应它,而不是削减它。

一般来说,数据库表很适合存储具有相似属性(如可能的奖励)的多个实例,而类很适合定义行为(它们如何显示),因此您不会走错路来考虑使用类,但我只需确保将有关这些奖励的数据实际存储在数据库中,并且只在您的编程代码中处理它们的行为,而不是数据本身。

票数 0
EN

Stack Overflow用户

发布于 2015-06-11 02:38:49

如果奖励可能有自己的业务逻辑(比如发送衬衫),那么使用类会更好。

代码语言:javascript
复制
interface RewardInterface
{
    public function getName();

    public function getDescription();

    public function reward();
}

class NextOrderReward implements RewardInterface
{
    private $percent;

    public function __construct($percent = 10)
    {
        $this->percent = $percent;
    }

    public function getName()
    {
        return $this->percent.'% Off Your Next Order';
    }

    public function getDescription()
    {
        return 'Take '.$this->percent.'% off your next order on our website!';
    }

    public function reward()
    {
        // create coupon
    }
}

class FreeShirtReward implements RewardInterface
{
    public function getName()
    {
        return 'Free T-Shirt';
    }

    public function getDescription()
    {
        return 'Get a free t-shirt!';
    }

    public function reward()
    {
        // send tshirt to customer
    }
}

使用。

代码语言:javascript
复制
$rewards = [new NextOrderReward(), new NextOrderReward(20), new FreeShirtReward()];

<ul> 
    @foreach($rewards as $reward) 
        <li>{{ $reward->getName() }} <span>{{ $reward->getDescription() }}</span></li>
    @endforeach
</ul>

一次实例化所有RewardInterface类。当然,所有的构造函数都不应该有参数。

代码语言:javascript
复制
$rewards = [];
foreach (get_declared_classes() as $className) {
    if (in_array('RewardInterface', class_implements($className))) {
        $rewards[] = new $className();
    }
}

请注意,如果没有用于奖励的特定业务逻辑,则使用类可能是过度设计。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30763608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档