Улучшение атрибута модели для повышения эффективности и удобства использования - PullRequest
0 голосов
/ 25 декабря 2018

Framework: 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-запросы (я мог бы реализовать один запрос, чтобы получить счетчик в конце, и на основании этого принять решение, если сам продукт можно купить, но вместо этого я загружаю все варианты - по крайней мере, пока не получу один сbuyasable = true -)

Вопрос: Должен ли я сохранить эту реализацию или улучшить ее, избавившись от растягивающих отношений и выполнив простой запрос SQL, чтобы получить покупные варианты?

Пожалуйста, опишите ваш ответ как можно больше.

Редактировать : Также, пожалуйста, дайте мне знать, если вы думаете, что существуют какие-либо плюсы / минусы.

1 Ответ

0 голосов
/ 25 декабря 2018

Прежде всего, в соответствии со стандартом кодирования, вы можете избавиться от этой вложенной структуры if-else в методе getPurchasableAttribute (), как этот

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;
}

Можете ли вы рассказать что-то еще о $Вариант-> покупаемый

Является ли покупаемый красноречивым отношением, определенным в $ вариации или атрибутом $ вариации.

Чтобы мы могли поговорить об эффективности более подробно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...