Laravel eloquent模型的属性转换(我应该转换哪些属性类型?)
Laravel eloquent模型的属性转换(我应该转换哪些属性类型?)
我不确定我是否完全理解Laravel Eloquent属性转换。根据文档(https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting),支持以下类型:整数、实数、浮点数、双精度、十进制、字符串、布尔值、对象、数组、集合、日期、日期时间、时间戳、加密、加密对象、加密数组和加密集合。到目前为止,我只在我的模型上使用了日期转换(当字段在数据库中存储为时间戳时),像这样:
protected $dates = [ 'modified_at', 'published_at' ];
我也理解当值以整数(0或其他值)存储时,需要将属性转换为布尔值。但是其他属性类型(例如整数),我应该始终进行属性转换吗?还是只有在数据库中的字段类型不同时才需要进行转换?对于其他属性,有什么使用案例或最佳实践呢?
(例如,我无法想象在迁移中创建一个字符串字段,然后将一些数字保存为字符串,然后在模型中将其转换回整数?)
Laravel Eloquent模型模型属性转换(应该转换哪些属性类型?)
在默认情况下,属性将转换为表中定义的列的类型。所以,如果你的列是整数,那么它将被转换为int
类型。
但是,如果您想要修改特定字段的此行为会发生什么?这就是属性转换的作用。
例如,假设我们在一个名为projects
的表中有一个名为config
的列,该列的类型为json
,我们可以在其中为每个项目存储额外的配置元素。
在我的情况下,能够将这个数据处理为一个array
将非常有用。因此,我们不需要接收string
或object
,只需处理一个简单的array
。为了做到这一点,我们只需要:
class Project extends Model { // ... protected $casts = [ 'config' => 'array', ]; // ... }
这样,每当我们使用Eloquent从数据库中获取项目时,每个记录的该属性都将作为一个array
。而且,在尝试存储/更新记录时,它将被转换回json
。
关于您指定的情况(将元素保存为string
,但在检索时将其作为integer
),当然是可能的。您需要为该字段设置访问器和修改器。例如,对于一个名为number
的属性:
/** * 当获取元素时将会调用此方法。 */ public function getNumberAttribute($value) { return (int)$value; } /** * 当存储/更新元素时将会调用此方法。 */ public function setFirstNameAttribute($value) { $this->attributes['number'] = (string)$value; }
现在,为什么需要这样做呢?好吧,你可能正在处理一个设计不良的数据库,或者正在使用多个系统使用的生产数据库,难以实现对数据库的更改。在这些情况下,您可以利用这种类型的值操作使其按照您的要求工作。
感谢Kenny,这解决了我的疑惑...根据需要/希望进行转换,但不是一直进行转换。
清晰而且非常有见识的回答。谢谢Kenny!
非常有帮助,感谢您花时间探索这个问题,我从您这里很好地理解了它。