Laravel雄辩的模型模型属性转换(我应该转换哪种属性类型?)

时间:2020-10-30 15:54:29

标签: php laravel eloquent

我不确定我是否完全了解Laravel Eloquent属性转换。根据文档(https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting),以下是受支持的类型:

整数,实数,浮点数,双精度数,十进制:,字符串,布尔值,对象,数组,集合,日期,日期时间,时间戳,加密,加密:对象,加密:数组和加密:集合

到目前为止,我仅在模型上使用日期强制转换(当字段以时间戳存储在db中时),如下所示:

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

我还理解当值存储为整数(0或其他)时,需要将属性强制转换为布尔值。

但是对于其他属性类型(例如,整数),我应该始终进行属性转换吗?还是仅当数据库中的字段属于其他类型时?用例是什么?其他属性的最佳做法是什么?

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

1 个答案:

答案 0 :(得分:2)

默认情况下,属性将强制转换为表中定义的列类型。因此,如果您的列是整数,则将其强制转换为int

但是,如果您想为特定字段修改此行为,会发生什么?那是属性转换进入场景的时候。

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

就我而言,能够将这些数据作为array处理将很有用。因此,我们可以只处理一个简单的string,而不是接收objectarray。为此,我们只需:

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;
}

现在,需要这样做的原因吗?那么,您可能正在处理设计不当的数据库,或者正在使用多个系统使用的生产数据库,并且数据库很难完成。在这种情况下,您可以利用这种价值操纵来在应用程序中按需工作。

相关问题