Индексы миграции
Построитель схем Laravel поддерживает несколько типов индексов. В следующем примере создается новый столбец email
и указывается, что его значения должны быть уникальными. Чтобы создать индекс, мы можем связать метод unique
с определением столбца:
database/migrations/метка.create_posts_table.php<?php
class CreatePostsTable extends Migration
{
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->string('email')->unique();
});
}
public function down()
{
Schema::dropIfExists('posts');
}
}
В качестве альтернативы вы можете создать индекс после определения столбца. Для этого вы должны вызвать метод unique
построителя схемы Blueprint. Этот метод принимает имя столбца, который должен получить уникальный индекс:
$table->unique('email');
Вы даже можете передать массив столбцов методу индекса для создания составного индекса:
$table->index(['account_id', 'created_at']);
При создании индекса Laravel автоматически сгенерирует имя индекса на основе таблицы, имен столбцов и типа индекса, но вы можете передать второй аргумент методу, чтобы указать имя индекса самостоятельно:
$table->unique('email', 'unique_email');
Доступные типы индексов
Построитель схем Laravel содержит методы для создания каждого типа индекса, поддерживаемого Laravel. Каждый метод индекса принимает необязательный второй аргумент для указания имени индекса. Если не указано, то имя будет производным от имен таблицы и столбцов, используемых для индекса, а также типа индекса. Все доступные методы индекса описаны в таблице ниже:
Команда | Описание |
---|---|
$table->primary('id');
|
Добавить первичный ключ |
$table->primary(['id', 'parent_id']);
|
Добавить составной ключ |
$table->unique('email');
|
Добавить уникальный индекс |
$table->index('state');
|
Добавить простой индекс |
$table->fullText('body');
|
Добавить полнотекстовый индекс (MySQL/PostgreSQL) |
$table->fullText('body')->language('english');
|
Добавить полнотекстовый индекс для указанного языка (PostgreSQL) |
$table->spatialIndex('location');
|
Добавить пространственный индекс (кроме SQLite) |
Переименование индексов
Чтобы переименовать индекс, вы можете использовать метод renameIndex
построителя схемы Blueprint. Этот метод принимает текущее имя индекса в качестве первого аргумента и желаемое имя в качестве второго аргумента:
$table->renameIndex('from', 'to')
Удаление индексов
Чтобы удалить индекс, вы должны указать имя индекса. По умолчанию Laravel автоматически назначает имя индекса на основе имени таблицы, имени индексированного столбца и типа индекса. Вот некоторые примеры:
Команда | Описание |
---|---|
$table->dropPrimary('users_id_primary');
|
Удалить первичный ключ из таблицы users |
$table->dropUnique('users_email_unique');
|
Удалить уникальный индекс из таблицы users |
$table->dropIndex('geo_state_index');
|
Удалить простой индекс из таблицы geo |
$table->dropFullText('posts_body_fulltext');
|
Удалить полнотекстовый индекс из таблицы posts |
$table->dropSpatialIndex('geo_location_spatialindex');
|
Удалить пространственный индекс из таблицы geo (кроме SQLite) |
Если вы передадите массив столбцов в метод, удаляющий индексы, то обычное имя индекса будет сгенерировано на основе имени таблицы, столбцов и типа индекса:
Schema::table('geo', function (Blueprint $table) {
$table->dropIndex(['state']); // Удалить простой индекс `geo_state_index`.
});