Laravel eloquent模型的属性转换(我应该转换哪些属性类型?)

4 浏览
0 Comments

Laravel eloquent模型的属性转换(我应该转换哪些属性类型?)

我不确定我是否完全理解Laravel Eloquent属性转换。根据文档(https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting),支持以下类型:整数、实数、浮点数、双精度、十进制、字符串、布尔值、对象、数组、集合、日期、日期时间、时间戳、加密、加密对象、加密数组和加密集合。到目前为止,我只在我的模型上使用了日期转换(当字段在数据库中存储为时间戳时),像这样:

protected $dates = [
    'modified_at', 'published_at'
];

我也理解当值以整数(0或其他值)存储时,需要将属性转换为布尔值。但是其他属性类型(例如整数),我应该始终进行属性转换吗?还是只有在数据库中的字段类型不同时才需要进行转换?对于其他属性,有什么使用案例或最佳实践呢?

(例如,我无法想象在迁移中创建一个字符串字段,然后将一些数字保存为字符串,然后在模型中将其转换回整数?)

0
0 Comments

Laravel Eloquent模型模型属性转换(应该转换哪些属性类型?)

在默认情况下,属性将转换为表中定义的列的类型。所以,如果你的列是整数,那么它将被转换为int类型。

但是,如果您想要修改特定字段的此行为会发生什么?这就是属性转换的作用。

例如,假设我们在一个名为projects的表中有一个名为config的列,该列的类型为json,我们可以在其中为每个项目存储额外的配置元素。

在我的情况下,能够将这个数据处理为一个array将非常有用。因此,我们不需要接收stringobject,只需处理一个简单的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!

非常有帮助,感谢您花时间探索这个问题,我从您这里很好地理解了它。

0