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



我正在尝试使用 Laravel 创建迁移,但我的情况是我需要自定义列类型,因为我想要的列类型不包含在架构生成器中,即"多边形"。所以我想知道,除了架构构建器中已有的列类型之外,如何创建自定义列类型。

我想要的在SQL语句中看起来像这样:

更改表xxx添加polygon多边形不为空

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

我知道我可以这样做:

DB::statement('ALTER TABLE country ADD COLUMN polygon POLYGON');

但它导致我错误地认为该表不存在。

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

<?php
use IlluminateDatabaseSchemaGrammarsGrammar;
// 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');
});

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

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

我假设您的数据库中需要空间字段...我会考虑通过 Packagist.org 并搜索laravel-geo(或等效项( - 它支持空间列 tyes inc 多边形。然后,您可以为自定义字段使用标准的Laravel迁移文件 - 例如

$table->polygon('column_name');

在迁移文件的 UP 函数中...

最新更新