Laravel:创建一个动态属性

ewo*_*wok 5 php mysql laravel eloquent

我现在有一个体面的代码库.我有几个表与匹配的Eloquent模型,在表单中存储地址### Street, City, ST, xzipx.这些在数据库中由一个名为的varchar字段表示address.

现在这是我的问题.我想添加一个新功能,允许通过它们是否在同一个城市,州等进行比较.在我的数据库当前配置时,这样做的方法是对地址字符串进行标记.这很好,但每次都必须这样做有点烦人.

理想的解决方案将是重组的数据库和相关模型,对分裂address场分为street,city,state,和zip.那里唯一的问题是,在我正在使用的地方访问地址的其他地方$model->address,我将不得不从碎片构建它.这在整个代码中都发生了很多,所以即使创建一个辅助函数如下:

public function address(){
  return $this->street.", ".$this->city.", ".$this->state." ".$this->zip;
}
Run Code Online (Sandbox Code Playgroud)

将强制更换的所有实例$model->address$model->address(),这仍然是繁琐.理想的解决方案是创建动态属性,就像Laravel如何使用关系创建它们一样.这可能吗?

或者有更好的解决方案吗?

der*_*aug 13

您可以为address属性定义一个访问者:

class YourClass {
    public function getAddressAttribute()
    {
        return $this->street.", ".$this->city.", ".$this->state." ".$this->zip;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,$object->address应该返回你需要的东西.如果您希望将它包含在模型的数组和JSON表单中,则需要将其添加到$appends模型的属性中.

class YourClass {
    protected $appends = array('address');
    public function getAddressAttribute()
    {
        return $this->street.', '.$this->city.', '.$this->state.' '.$this->zip;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:设置,你必须设置一个mutator,如下所示:

public function setAddressAttribute($value)
{
    // assume $this->handlesParsingAddress parses and returns an assoc array
    $parsed = $this->handlesParsingAddress($value);
    $this->street = $parsed['street'];
    $this->city = $parsed['city'];
    $this->state = $parsed['state'];
    $this->zip = $parsed['zip'];        
}
Run Code Online (Sandbox Code Playgroud)