我不确定我完全理解拉勒维尔雄辩的属性铸造。根据文档,(https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting),这些是受支持的类型:
整数,实数,浮点数,双小数点:,字符串,布尔值,对象,数组,集合,日期,日期,时间,时间戳,加密,加密:对象,加密:数组,加密:集合
到目前为止,我只对我的模型使用了日期转换(当字段作为时间戳存储在db中时),如下所示:
protected $dates = [
'modified_at', 'published_at'
];
当将值存储为整数(0或其他事物)时,我还理解了将属性转换为布尔值的必要性。
但是其他属性类型(例如整数)呢,我应该总是进行属性转换吗?还是仅仅当数据库中的字段类型不同时?用例是什么,或者其他属性的最佳实践是什么?
(例如,我不能想象在迁移中创建一个字符串字段,然后将其中的一些数字保存为string,然后将其转换回模型中的整数?)
发布于 2020-10-30 08:41:52
默认情况下,属性将转换为表中定义的列类型。因此,如果您的列是一个整数,那么它将被转换为int
。
但是,如果要针对特定字段修改此行为,会发生什么?这就是属性转换进入场景的时候。
例如,假设在一个名为projects
的表中有一个名为config
的json
类型的列,在该列中我们可以存储每个项目的附加配置元素。
在我的例子中,能够以array
的形式处理这些数据是很有用的。因此,我们可以只处理简单的string
或object
,而不是接收一个array
或object
。为了做到这一点,我们只是:
class Project extends Model
{
// ...
protected $casts = [
'config' => 'array',
];
// ...
}
这样,每当我们使用雄辩的方法从数据库中获取项目时,每个记录都将该属性作为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;
}
现在,是需要这样做的原因吗?,您可能处理的数据库设计不当,或者生产数据库正在被多个系统使用,而且数据库中的更改很难完成。在这些情况下,您可以使用这种值操作,以便在您的应用程序中工作。
https://stackoverflow.com/questions/64611696
复制