Миграции базы данных 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 в вашем файле миграции...