0

我正在尝试使用 Laravel 创建迁移,但我需要自定义列类型,因为我想要的列类型不包含在模式生成器中,即“POLYGON”。所以我想知道,除了模式构建器中已经存在的列类型之外,我如何创建我的自定义列类型。

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

更改表xxx添加polygonPOLYGON 不为空

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

我知道我可以这样做:

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

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

4

2 回答 2

1

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

<?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');
});

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

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

于 2020-10-11T11:56:13.750 回答
0

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

$table->polygon('column_name');

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

于 2017-08-21T05:36:22.570 回答