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, чтобы получить покупные варианты?
Пожалуйста, опишите ваш ответ как можно больше.
Редактировать : Также, пожалуйста, дайте мне знать, если вы думаете, что существуют какие-либо плюсы / минусы.