繁体   English   中英

Laravel 5 Eloquent,如何动态设置强制转换属性

[英]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将该字段识别为可转换 如果没有设置类型 ,可以将默认转换放在那里。

更新:

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

  1. 始终传递一个属性数组,其中类型键位于键之前 - 此时模型的fill()方法在处理数据时遵循键的顺序,但它不是面向未来的。

  2. 在设置其他属性之前,请明确设置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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM