Php Laravel 5口若悬河,如何动态设置演员属性

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 | 可以设置值属性转换,具体取决于类型字段,该字段在写入(创建/更新)和获取两种情况下

在laravel 5.1中,有一个称为属性转换的新功能,在这里有详细的记录:

我的问题是,可以动态地进行属性转换吗

例如,我有一个包含列的表:

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中,以便雄辩者将该字段识别为可浇铸。如果未设置类型,则可以将默认强制转换放在此处使用

更新:

当从数据库中读取数据时,上述方法非常有效。写入数据时,必须确保在之前设置类型。有两种选择:

  • 始终传递一个属性数组,其中type键在value键之前-此时模型的fill()方法在处理数据时尊重键的顺序,但这不是未来的证明

  • 在设置其他属性之前,明确设置类型属性。使用以下代码可以轻松完成此操作:

    $model == (new Model(['type' => $data['type']))->fill($data)->save();
    

  • 啊,我喜欢。比我的选择要好得多。该睡觉了。酷:)我还没有测试过这段代码,所以如果您有任何问题,请告诉我,我会帮您解决的。我可以在您的表中看到type列-我想这是用来确定强制类型的,对吗?查看雄辩模型的代码,除了确保在值之前设置类型之外,没有其他方法了——所有参与转换的方法都只能访问正在转换的当前属性,而不能访问整个更改集。但是在设置值时,create/update会尊重$attributes数组中的顺序,这样您就可以使用它了。very nice chat@jedrzej.kurylo you save my day:D