我不确定我是否完全了解Laravel Eloquent属性转换。根据文档(https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting),以下是受支持的类型:
整数,实数,浮点数,双精度数,十进制:,字符串,布尔值,对象,数组,集合,日期,日期时间,时间戳,加密,加密:对象,加密:数组和加密:集合
到目前为止,我仅在模型上使用日期强制转换(当字段以时间戳存储在db中时),如下所示:
protected $dates = [
'modified_at', 'published_at'
];
我还理解当值存储为整数(0或其他)时,需要将属性强制转换为布尔值。
但是对于其他属性类型(例如,整数),我应该始终进行属性转换吗?还是仅当数据库中的字段属于其他类型时?用例是什么?其他属性的最佳做法是什么?
(例如,我无法想象在迁移中创建一个字符串字段,然后将其中的一些数字保存为字符串,然后将其转换回模型上的整数吗?)
答案 0 :(得分:2)
默认情况下,属性将强制转换为表中定义的列类型。因此,如果您的列是整数,则将其强制转换为int
。
但是,如果您想为特定字段修改此行为,会发生什么?那是属性转换进入场景的时候。
例如,假设我们在名为projects
的表中有一个类型为config
的名为json
的列,我们可以在其中存储每个项目的其他配置元素。
就我而言,能够将这些数据作为array
处理将很有用。因此,我们可以只处理一个简单的string
,而不是接收object
或array
。为此,我们只需:
class Project extends Model
{
// ...
protected $casts = [
'config' => 'array',
];
// ...
}
这样,每当我们使用Eloquent从数据库中获取项目时,每条记录都会将该属性作为array
。而且,在尝试存储/更新记录时,它将转换回json
。
与您指定的情况(将元素另存为string
,然后将其另存为integer
)当然是完全可能的。您需要为该字段设置访问器和更改器。对于名为number
的属性:
/**
* This will be called when fetching the element.
*/
public function getNumberAttribute($value)
{
return (int)$value;
}
/**
* This will be called when storing/updating the element.
*/
public function setFirstNameAttribute($value)
{
$this->attributes['number'] = (string)$value;
}
现在,需要这样做的原因吗?那么,您可能正在处理设计不当的数据库,或者正在使用多个系统使用的生产数据库,并且数据库很难完成。在这种情况下,您可以利用这种价值操纵来在应用程序中按需工作。