将值分配给模型中的自定义属性

时间:2020-08-19 18:13:37

标签: laravel

如何为我的自定义属性分配值?我来自Yii2背景,并且很简单。我在这里做的:

protected $appends = ['sites'];
    public function getSitesAttribute()
        {
            return $this->sites;
        }
    
        public function setSitesAttribute($value)
        {
            $this->attributes['sites'] = $value;
        }

尝试分配类似mymodel->sites = ['1', '2', '3']的方法,但没有成功。尝试获取mymodel->sites值后,将引发错误:undefined property 'sites'

2 个答案:

答案 0 :(得分:1)

问题出在$this->sites上。正确的是,它将引发您的类实例不具有属性$sites的异常。

看看Model的{​​{3}}方法。您可以在此处看到正在进行getAttribute($key)的呼叫。深入研究,您会发现在某些时候,__get方法中正在执行以下代码:

if ($this->hasGetMutator($key)) {
    return $this->mutateAttribute($key, $value);
}

这段代码调用您的getSitesAttribute方法。

transformModelValue,您会看到它尝试通过调用$key从属性数组中检索sitesgetAttributeFromArray($key))的值。这将返回存储在attributes变量所在的setSitesAttribute数组中的值。

我可以想到的以下选项:

  1. 删除访问器,以使模型从$attributes数组中检索值。
protected $appends = ['sites'];

public function setSitesAttribute($value)
{
    $this->attributes['sites'] = $value;
}
  1. 将值存储在$sites属性中并从中检索。不确定$appends是否仍然有效。
protected $appends = ['sites'];

private $sites = [];

public function getSitesAttribute()
{
    return $this->sites;
}

public function setSitesAttribute($value)
{
    $this->sites = $value;
}

答案 1 :(得分:1)

您的accessor不太正确,请注意,您返回的不是$this->attributes['sites'];,而是$this->sites

class MyModel extends Model
{
    public function getSitesAttribute()
    {
        return $this->attributes['sites'];
    }

    public function setSitesAttribute($value)
    {
        $this->attributes['sites'] = $value;
    }
}

然后;

$my_model->sites = [1,2,3];
$my_model->sites; // [1,2,3]

您可能想在模型构造函数中为$this->attributes['sites']设置初始默认值。