如何在使用Accessor时在Eloquent Laravel中设置其他自定义属性

时间:2018-01-27 14:47:36

标签: php laravel eloquent accessor

我在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()访问器中使用完全相同的代码毫无意义。有什么想法吗?

1 个答案:

答案 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
}

我希望这会至少对将来的人有所帮助。