Laravel 8 自定义类型转换
Laravel 内置了多种常用的类型转换。但是,用户偶尔会需要将数据转换成自定义类型。现在,该需求可以通过定义一个实现 CastsAttributes
接口的类来完成。
实现了该接口的类必须事先定义一个 get
和 set
方法。get
方法负责将从数据库中获取的原始数据转换成对应的类型,而 set
方法则是将数据转换成对应的数据库类型以便存入数据库中。举个例子,下面我们将内置的 json
类型转换以自定义类型转换的形式重新实现一遍:
<?php
namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
class Json implements CastsAttributes
{
/**
* 将取出的数据进行转换
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @param mixed $value
* @param array $attributes
* @return array
*/
public function get($model, $key, $value, $attributes)
{
return json_decode($value, true);
}
/**
* 转换成将要进行存储的值
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @param array $value
* @param array $attributes
* @return string
*/
public function set($model, $key, $value, $attributes)
{
return json_encode($value);
}
}
定义好自定义类型转换后,可以使用其类名称将其附加到模型属性:
<?php
namespace App\Models;
use App\Casts\Json;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'options' => Json::class,
];
}