Laravel 数据库迁移架构构建器自定义列类型

Tar*_*epp 2 laravel laravel-schema-builder

我正在尝试使用 Laravel 创建迁移,但我处于一种需要自定义列类型的情况,因为我想要的列类型不包含在模式构建器中,即“POLYGON”。所以我想知道如何创建自定义列类型,而不是架构生成器中已有的列类型。

我想要的 SQL 语句如下所示:

更改表xxx添加polygonPOLYGON 不为空

是否可以自己做,或者我被迫使用这样的

我知道我可以这样做:

DB::statement('ALTER TABLE country ADD COLUMN polygon POLYGON');
Run Code Online (Sandbox Code Playgroud)

但这导致我出现该表不存在的错误。

hBG*_*BGl 5

没有内置的方法可以做到这一点,但您可以用最少的代码获得良好的结果。

<?php

use Illuminate\Database\Schema\Grammars\Grammar;

// Put this in a service provider's register function.
Grammar::macro('typePolygon', function (Fluent $column) {
    return 'POLYGON';
});
 
// This belongs in a migration.
Schema::create('my_table', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->addColumn('polygon', 'my_foo');
});
Run Code Online (Sandbox Code Playgroud)

关键是将具有该名称的函数添加typePolygon到 Grammar 类中,因为该函数决定特定 DBMS 使用的实际类型。我们通过向语法添加宏来实现这一点。

我写了一篇关于如何将此解决方案扩展到任何自定义类型的博客文章:https://hbgl.dev/add-columns-with-custom-types-in-laravel-migrations/