Php Laravel 5口若悬河,如何动态设置演员属性
在laravel 5.1中,有一个称为属性转换的新功能,在这里有详细的记录: 我的问题是,可以动态地进行属性转换吗 例如,我有一个包含列的表:Php Laravel 5口若悬河,如何动态设置演员属性,php,laravel,casting,laravel-5,eloquent,Php,Laravel,Casting,Laravel 5,Eloquent,在laravel 5.1中,有一个称为属性转换的新功能,在这里有详细的记录: 我的问题是,可以动态地进行属性转换吗 例如,我有一个包含列的表: id | name | value | type | 1 | Test_Array | [somearray] | array | 2 | Test_Boolean | someboolean | boolean | 可以设置值属性转换,具体取决于类型字段,该字段在写入(创建/更新)和获取两种情况下
id | name | value | type |
1 | Test_Array | [somearray] | array |
2 | Test_Boolean | someboolean | boolean |
可以设置
值
属性转换,具体取决于类型
字段,该字段在写入(创建/更新)和获取两种情况下都起作用。每当访问字段时,而不是从数据库获取字段时,它使用的$casts
属性。因此,您可以在填充模型后更新$casts
属性,并且无论何时访问值
字段,该属性都可以正常工作。当类型
字段发生更改时,您只需要了解如何更新$casts
属性
一个可能的选项是重写fill()
方法,以便它首先调用父fill()
方法,然后使用type
字段中的数据更新$casts
属性
另一个可能的选择是滥用mutator功能,并在
type
字段上创建一个mutator,这样每当它更改时,它都会更新$casts
属性。您需要覆盖模型类中雄辩模型的getCastType()方法:
protected function getCastType($key) {
if ($key == 'value' && !empty($this->type)) {
return $this->type;
} else {
return parent::getCastType($key);
}
}
您还需要将值添加到$this->casts中,以便雄辩者将该字段识别为可浇铸。如果未设置类型,则可以将默认强制转换放在此处使用
更新:
当从数据库中读取数据时,上述方法非常有效。写入数据时,必须确保在值之前设置类型。有两种选择:
$model == (new Model(['type' => $data['type']))->fill($data)->save();
啊,我喜欢。比我的选择要好得多。该睡觉了。酷:)我还没有测试过这段代码,所以如果您有任何问题,请告诉我,我会帮您解决的。我可以在您的表中看到type列-我想这是用来确定强制类型的,对吗?查看雄辩模型的代码,除了确保在值之前设置类型之外,没有其他方法了——所有参与转换的方法都只能访问正在转换的当前属性,而不能访问整个更改集。但是在设置值时,create/update会尊重$attributes数组中的顺序,这样您就可以使用它了。very nice chat@jedrzej.kurylo you save my day:D