Миграции базы данных Laravel Тип настраиваемого столбца в построителе схемы

Я пытаюсь создать миграции с помощью Laravel, но я нахожусь в ситуации, когда мне нужен пользовательский тип столбца, так как тот, который мне нужен, не включен в построитель схем, а именно "POLYGON". Поэтому я хочу знать, как я могу создать свой собственный тип столбца, отличный от тех, которые уже есть в компоновщике схемы.

То, что я хочу, выглядело бы так в выражении SQL:

изменить таблицу xxx добавлять polygon ПОЛИГОН не нуль

Возможно ли это сделать самостоятельно, или я вынужден использовать какую-то библиотеку, подобную этой?

Я знаю, что я могу сделать так:

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

но это приводит меня к ошибке, что таблица не существует.

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

Ключ в том, чтобы добавить функцию с именем typePolygonв класс Grammar, потому что эта функция определяет фактический тип, используемый конкретной СУБД. Мы достигаем этого, добавляя макрос в Grammar.

Я написал сообщение в блоге о том, как расширить это решение до любого настраиваемого типа: https://hbgl.dev/add-columns-with-custom-types-in-laravel-migrations/

Я предполагаю, что вам требуются пространственные поля в вашей БД... Я хотел бы рассмотреть через Packagist.org и искать laravel-geo (или эквивалентный) - который поддерживает типы пространственных столбцов, включая Polygon. Затем вы можете использовать стандартные файлы миграции Laravel для своих пользовательских полей -eg

$table->polygon('column_name');

В вашей функции UP в вашем файле миграции...

Другие вопросы по тегам