У меня есть сгенерированный (storedAs
) столбец в моей базе данных Laravel, который принимает два decimal
столбца lat
и lng
и возвращает point
геопространственный тип. Я использую сгенерированный столбец, чтобы избежать сценария, в котором столбцы десятичной широты / ширины каким-либо образом обновляются, а столбец пространственной ширины - нет (или наоборот).
Я также хотел бы проиндексировать этот столбец, чтобы выполнить быстрый поиск, но натолкнулся на небольшую заминку. Я использую построитель миграции Laravel для генерации схемы таблицы. Хотя исходные столбцы не обнуляются и по умолчанию 0
, он не будет работать, если я также добавлю пространственный индекс, поскольку все части должны быть не нулевыми. Я предполагаю, что «все части» относятся только к столбцу latlng
.
Миграция ниже использует метод spatialIndex()
из Grimzy's Laravel MySQL Пространственное расширение , но я не думаю, что это проблема, так как стандартный класс Laravel Blueprint
также возвращает тот же результат.
public function up()
{
Schema::table('locations', function (Blueprint $table) {
$table->decimal('lat', 8, 6)->default(0);
$table->decimal('lng', 9, 6)->default(0);
$table->point('latlng')->storedAs('POINT(lat, lng)');
$table->spatialIndex('latlng');
});
}
При миграции:
Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1252 All parts of a SPATIAL index must be NOT NULL (SQL: alter table `locations` add spatial `locations_latlng_spatial`(`latlng`))
Мое единственное предположение является то, что MySQL не поддерживает пространственные индексы для сгенерированных столбцов. Или я что-то не так делаю?
ОБНОВЛЕНИЕ: кажется, я использую MariaDB, а не MySQL, который в настоящее время их не поддерживает.