![](/img/trans.png)
[英]Laravel 5.4: Eloquent sync() not using model's mutator or attribute casting?
[英]Laravel eloquent model model attribute casting (Which attribute types should I cast?)
我不确定我是否完全理解 Laravel Eloquent 属性转换。 根据文档( https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting ),这些是支持的类型:
整数、实数、浮点数、双精度数、十进制数:、字符串、布尔值、对象、数组、集合、日期、日期时间、时间戳、加密、加密:对象、加密:数组和加密:集合
到目前为止,我只在我的模型上使用了日期转换(当字段作为时间戳存储在数据库中时),如下所示:
protected $dates = [
'modified_at', 'published_at'
];
我也理解当值存储为整数(0 或其他)时需要将属性转换为布尔值。
但是对于其他属性类型(例如整数),我应该总是进行属性转换吗? 或者只是当数据库中的字段属于不同类型时? 有哪些用例或其他属性的最佳实践是什么?
(例如,我无法想象在迁移中创建一个字符串字段,然后将其中的一些数字保存为字符串,然后将其转换回模型上的整数?)
默认情况下,属性将转换为表中定义的列类型。 因此,如果您的列是整数,那么它将被转换为int
。
但是,如果您想为特定字段修改此行为,会发生什么? 那是属性转换进入场景的时候。
例如,假设我们在名为projects
的表中有一个名为config
的json
类型列,我们可以在其中存储每个项目的其他配置元素。
就我而言,能够将这些数据作为array
处理会很有用。 因此,我们可以只处理一个简单的array
,而不是接收string
或object
。 为此,我们只需:
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;
}
现在,有理由需要这样做吗? 好吧,您可能正在处理设计不当的数据库,或者处理多个系统正在使用的生产数据库,并且数据库中的更改很难完成。 在这些情况下,您可以利用这种值操作在您的应用程序中随心所欲地工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.