我在Laravel模型中使用Accessor时尝试设置其他自定义属性。
实施例:
我计算促销价格并设置此新属性,但另外想要设置" $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()
访问器中使用完全相同的代码毫无意义。有什么想法吗?
答案 0 :(得分:0)
我不知道这是否是您要实现的目标的正确实现,但这有两个技巧:
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
}
我希望这会至少对将来的人有所帮助。