Laravel 5.5中如何为模型字段指定布尔、日期时间等类型?
如何在Laravel 5.5中指定模型字段的类型?
嘿,这个问题问得很关键!首先得明确:$fillable属性只负责定义模型的批量赋值白名单——也就是告诉Laravel哪些字段可以通过create()、update()这类批量赋值方法来填充,它和字段的数据类型完全不相关。
要指定字段的类型,需要从两个层面入手:数据库结构定义,以及模型的类型转换配置,下面一步步说:
1. 在数据库迁移中定义字段的实际类型
字段的底层数据类型是在迁移文件里定义的,这直接决定了数据库存储该字段的格式。比如创建users表的迁移文件里,你可以这样定义不同类型的字段:
Schema::create('users', function (Blueprint $table) { $table->increments('id'); // 自增主键(整数类型) $table->string('name'); // 字符串类型 $table->string('email')->unique(); // 唯一字符串 $table->string('password'); // 字符串 $table->date('birth_date'); // 日期类型(存储YYYY-MM-DD) $table->boolean('is_active')->default(false); // 布尔类型(数据库实际存tinyint(1)) $table->rememberToken(); $table->timestamps(); // 默认的datetime类型字段 });
常用的字段类型方法还有:datetime()(日期时间)、integer()(整数)、text()(长文本)、decimal()(小数)等,你可以根据需求选择对应的方法。
2. 在模型中配置类型转换(Casting)
虽然数据库里定义了类型,但Laravel默认可能会把某些字段以原始的数据库返回格式(比如布尔字段返回1/0,日期返回字符串)给你。这时可以在模型里用$casts属性,让框架自动把字段转换成你需要的类型:
class User extends Model { protected $fillable = [ 'name', 'email', 'password', 'birth_date', 'is_active' ]; // 定义字段的类型转换规则 protected $casts = [ 'is_active' => 'boolean', // 把数据库的tinyint(1)转为PHP布尔值(true/false) 'birth_date' => 'date', // 转为Carbon日期实例,方便做日期运算、格式化 // 其他常见示例: // 'age' => 'integer', // 'settings' => 'array', // 把数据库的JSON字符串转为PHP数组 // 'created_at' => 'datetime', ]; }
配置后,你在代码里调用$user->is_active会直接得到布尔值,$user->birth_date会是一个Carbon对象,你可以直接用$user->birth_date->format('Y-m-d')或者$user->birth_date->diffForHumans()这类便捷方法。
额外补充
- Laravel默认会把模型的
created_at、updated_at字段自动转为Carbon实例,不需要手动添加到$casts里; - 支持的转换类型包括:
integer、real、float、double、string、boolean、array、date、datetime、encrypted等,覆盖大部分常用场景; - 如果你需要存储数组/对象,可以用
$casts指定array类型,Laravel会自动把它序列化为JSON存入数据库,取出时再转成PHP数组。
内容的提问来源于stack exchange,提问作者Daniele Dolci
相关产品推荐
相关产品推荐

