Я пытаюсь установить дополнительный пользовательский атрибут при использовании 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.
Создайте виртуальную связь для этой строки в аксессоре с новым 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
}
Надеюсь, это поможет хоть кому-то в будущем.
Других решений пока нет …