Как установить дополнительный настраиваемый атрибут в Eloquent Laravel при использовании Accessor

Я пытаюсь установить дополнительный пользовательский атрибут при использовании Accessor в модели Laravel.

Пример:
Я рассчитываю цену продвижения и устанавливаю этот новый атрибут, но в дополнение хочу установить$promo = 1 || $promo = 0«используя ту же логику.

Очень резкий пример просто с логикой. Настоящая логика гораздо глубже, поэтому я не хочу дублировать метод доступа:

public function getFinalPriceAttribute($value)
{

if($this->promotion == true) {
$final_price = $this->price * 100;
//here I want to add new attribute (promo = 1)
//Something like using another method here to setAttribute. Example: setPromoAttribute(1)
} else {
$final_price = $price;
//here I want to add new attribute (promo = 0)
//Something like using another method here to setAttribute. Example: setPromoAttribute(0)
}

return $final_price;
}

protected $appends = ['final_price', 'on_sale'];
}

Я могу легко продублировать весь getFinalPriceAttribute(), но нет смысла иметь точно такой же код в двух getAttribute() аксессоры. Любая идея?

1

Решение

Я не знаю, является ли это правильной реализацией того, чего вы хотите достичь, но вот два взлома:

1.

Создайте виртуальную связь для этой строки в аксессоре с новым Illuminate\Database\Eloquent\Collection а затем нажмите на элемент promo ценность в это. Но это будет решетка.

public function getFinalPriceAttribute($value)
{
$this->setRelation('promo', new Collection());
if($this->promotion == true) {
$final_price = $this->price * 100;
$this->promo->push(1);
} else {
$final_price = $price;
$this->promo->push(1);
}

return $final_price;
}

Так что в ответ вы получите promo как массив, как:

{
"promotion": true,
"promo": [
1
]
}

или же

{
"promotion": false,
"promo": [
0
]
}

2.

Создать два доступа для promo, Один как promo0 & другой promo1 и добавить атрибут динамически (и условно) с помощью append(), Но так вы получите два разных атрибута в ответе условно.

public function getPromo1Attribute()
{
return true;
}

public function getPromo0Attribute()
{
return true;
}

public function getFinalPriceAttribute($value)
{
if($this->promotion == true) {
$final_price = $this->price * 100;
$this->append('promo1');
} else {
$final_price = $price;
$this->append('promo0');
}

return $final_price;
}

И это вернет ответ как:

{
"promotion": true,
"promo1": true
}

или же

{
"promotion": false,
"promo0": true
}

Надеюсь, это поможет хоть кому-то в будущем.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector