Laravel 的迁移中使用非传统字段
Laravel 中的迁移是管理数据库 Schema 的好方法。从轻松创建和删除表的能力,到添加和删除列字段的能力,迁移是所有 Laravel 应用的重要组成部分。
尽管迁移涵盖了绝大部分与数据库 Schema 相关的内容,但可能会缺少一些东西。就像当你升级你的应用以使用 MySQL 的新版本时,Laravel 可能不支持新的字段类型。
例如,想象一个场景,我们想创建一个:
- 表,名为 posts
- 包含自增字段 id
- 包含一个显示宽度为 1 的整数字段
legacy_boolean
,默认值为 0 - 包含一个这两个字段的组合索引
目前,你必须像这样使用数据库语句来添加这些字段。
new class extends Migration {
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
});
DB::statement('alter table `posts` add `legacy_boolean` int(1) default 0 not null');
Schema::table('posts', function (Blueprint $table) {
$table->index(['id', 'legacy_boolean']);
});
}
};
很好,不过你可能已经注意到了,你必须在这里做出牺牲。我们不能使用单个表创建回调,因为数据库语句会立即触发,因此不能在 Schema::create(<table>, <callback>)
中使用。
为解决这个问题,现在我们有一个名为
Blueprint::rawColumn()
的新方法,它支持直接指定用于创建字段的字段类型定义。
因此,我们按如下方式重写上述迁移。
new class extends Migration {
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->rawColumn('legacy_boolean', 'int(1)')->default(0);
$table->index(['id', 'legacy_boolean']);
});
}
};
可以看出,rawColumn()
方法接受列类型定义作为第二个参数,你可以在其中指定 Laravel 不支持的列类型,这非常方便。