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

时间:2017-08-20 20:47:00

标签: laravel laravel-schema-builder

我正在尝试使用Laravel创建迁移,但我处于需要自定义列类型的情况,因为我想要的那个并不包含在架构构建器中,这是" POLYGON"。所以我想知道,除了那些已经在Schema构建器中的类型之外,我如何创建自定义列类型。

我希望在SQL语句中看起来像这样:

  

alter table xxx add polygon POLYGON not null

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

我知道我可以这样做:

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

但它让我知道表格不存在的错误。

2 个答案:

答案 0 :(得分:0)

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

$table->polygon('column_name');

在迁移文件的UP功能中......

答案 1 :(得分:0)

没有内置的方法可以执行此操作,但是您可以用最少的代码获得良好的结果。

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

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

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