![](/img/trans.png)
[英]How to set additional custom attribute in Eloquent Laravel while using Accessor
[英]Laravel 5 Eloquent, How to set cast attribute dynamically
在laravel 5.1中有一个名为属性转换的新功能,在此处有详细记录: http : //laravel.com/docs/5.1/eloquent-mutators#attribute-casting
我的问题是,可以动态地进行属性转换吗?
例如,我有一个包含列的表:
id | name | value | type |
1 | Test_Array | [somearray] | array |
2 | Test_Boolean | someboolean | boolean |
可以设置value
属性强制转换,取决于type
字段,在写入(创建/更新)和获取时都可以工作吗?
您需要在模型类中覆盖Eloquent模型的getCastType()方法:
protected function getCastType($key) {
if ($key == 'value' && !empty($this->type)) {
return $this->type;
} else {
return parent::getCastType($key);
}
}
您还需要为$ this-> casts添加值 ,以便Eloquent将该字段识别为可转换 。 如果没有设置类型 ,可以将默认转换放在那里。
更新:
从数据库中读取数据时,上述工作非常有效。 写入数据时,必须确保在值之前设置类型 。 有两种选择:
始终传递一个属性数组,其中类型键位于值键之前 - 此时模型的fill()方法在处理数据时遵循键的顺序,但它不是面向未来的。
在设置其他属性之前,请明确设置type属性。 可以使用以下代码轻松完成:
$model == (new Model(['type' => $data['type']))->fill($data)->save();
每次访问字段时使用的$casts
属性,而不是从数据库中获取的属性。 因此,您可以在填充模型后更新$casts
属性,并且每当您访问value
字段时它都可以正常工作。 您只需要在更改type
字段时弄清楚如何更新$casts
属性。
一个可能的选择是覆盖fill()
方法,以便它首先调用父fill()
方法,然后使用type
字段中的数据更新$casts
属性。
另一个可能的选择是滥用mutator功能,并在type
字段上创建一个mutator,这样每当它改变时,它都会更新$casts
属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.