编程

Laravel 的迁移中使用非传统字段

61 2024-12-31 18:37:00

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 不支持的列类型,这非常方便。