49
42

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravel でインデックスを作成、削除する

Last updated at Posted at 2018-11-22

Laravelではデータベースの定義をマイグレーションを使って更新します。
最近、インデックスの作成や削除する際に、インデックス名の指定方法ではまりました。
ドキュメントをよく見ればわかるのですが、ここに注意点をまとめます。

ここに載せるサンプルコードは、マイグレーションファイル内に記述することを想定しています。

作成

テーブル定義時に作成

Schema::create('books', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title')->index();  # Index
    $table->string('isbn')->unique();  # Create unique index
    $table->integer('price');
    $table->integer('author_id');
    $table->timestamps();
});

この例では2つのインデックスを作成しています。
テーブルのカラム定義の時に作成したインデックスの名前は、${table_name}_${column_name}_${index_type} のように自動で生成されます。
例えばこのサンプルコードだと、作成されるインデックスの名前はそれぞれbooks_title_indexbooks_isbn_uniqueです。

indexuniqueメソッドの引数として文字列を渡すことで、インデックス名を指定することができます。

テーブル定義後に作成

Schema::table('books', function (Blueprint $table) {
    $table->index('title');
});

カラム名を指定することで作成できます。上と同様に、この時に作成されるインデックス名は${table_name}_${column_name}_${index_type}です。
第2引数に文字列を渡すことでインデックス名を指定できます。

複合インデックス

Schema::table('author_book', function (Blueprint $table) {
    $table->index(['author_id', 'book_id']);
});

複合インデックスは、インデックスの対象のカラム名を配列で指定することで作成できます。

削除

削除は、インデックスの種類ごとでメソッドが異なります。
通常のインデックスにはdropIndex、ユニークインデックスにはdropUniqueを使います。

:warning: 渡す引数の型によって削除する対象のインデックスが異なるで注意が必要です。

文字列を渡した場合

指定した文字列と同じ名前のインデックスを削除する。
:warning: カラム名では無いので注意

$table->dropIndex('books_title_index');

文字列の配列を渡した場合

先のインデックス名の生成ルールで作成したインデックス名を削除します。

$table->dropIndex(['title']);

この例の場合、books_title_indexという名前のインデックスを削除します。

複数の要素を持つ配列を渡した場合、その要素をカラム名とする複合インデックスを削除します。
複合インデックスの場合、配列で指定したカラムの順序がインデックス名にも影響するので、削除する際にもその順序を守る必要があります。

まとめ

ドキュメントはよく読みましょう。

参考

49
42
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
49
42

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?