改善模型属性以提高效率和可用性

时间:2018-12-25 01:20:08

标签: php laravel laravel-5 laravel-5.1

框架: Laravel 5.1

背景:我有一个Product和一个ProductVariation模型,它们都具有ImplementsProductAttributes的特征。如果Product是变量,则产品至少应包含一个可购买的ProductVariation才能进行购买,其余逻辑在来自特征的代码示例中将显而易见。功能按原样工作。

public function getPurchasableAttribute()
{
    if ($this instanceof \App\Product)
    {
        if ($this->type == 'variable')
        {
            foreach ($this->variations as $variation)
            {
                if ($variation->purchasable)
                    return true;
            }

            return false;
        }
        else return $this->isItemPurchasable();
    }
    else
    {
        return $this->isItemPurchasable();
    }
}

public function isItemPurchasable()
{
    if($this->regular_price > 0 AND $this->published)
    {
        if ($this->manage_stock) 
        {
            return $this->stock_quantity > 0;
        }
        else return $this->in_stock;
    }
    else return false;
}

优点:

  • 我利用laravels属性
  • 可读/可维护的代码,

缺点:

  • 对版本的冗余渴望加载(这可能是一个问题 如果应该在API上使用)
  • 冗余SQL查询(我可以实现一个查询来获取一个 最后算数,并据此确定产品本身是否为 可购买,但我正在加载所有变体-至少 直到我得到一个purchasable = true-)

问题:我应该保留这种实现方式还是应该通过摆脱拉关系并进行简单的SQL查询以获取可购买的变体来进行改进?

请尽可能详细地说明您的答案。

编辑:如果您认为还有其他优点/缺点,也请告诉我。

1 个答案:

答案 0 :(得分:0)

首先,根据编码标准的考虑,您可以像这样在getPurchasableAttribute()方法中摆脱这种嵌套的if-else结构

public function getPurchasableAttribute()
{
    if (!( $this instanceof \App\Product) ||  $this->type != 'variable')
    {
        return $this->isItemPurchasable();
    }

    foreach ($this->variations as $variation)
    {
        if ($variation->purchasable)
            return true;
    }

    return false;
}

能否请您谈谈有关$ variation-> purchasable

的更多信息

可以购买在$ variation或$ variation属性中定义的雄辩的关系。

以便我们可以进一步谈论效率。