繁体   English   中英

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

[英]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的表中有一个名为configjson类型列,我们可以在其中存储每个项目的其他配置元素。

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM