我正在尝试使用Laravel创建迁移,但我处于需要自定义列类型的情况,因为我想要的那个并不包含在架构构建器中,这是" POLYGON"。所以我想知道,除了那些已经在Schema构建器中的类型之外,我如何创建自定义列类型。
我希望在SQL语句中看起来像这样:
alter table
xxx
addpolygon
POLYGON not null
是否可以自己做,或者我被迫使用像this这样的库?
我知道我可以这样做:
DB::statement('ALTER TABLE country ADD COLUMN polygon POLYGON');
但它让我知道表格不存在的错误。
答案 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/