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_index
とbooks_isbn_unique
です。
index
、unique
メソッドの引数として文字列を渡すことで、インデックス名を指定することができます。
テーブル定義後に作成
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
を使います。
渡す引数の型によって削除する対象のインデックスが異なるで注意が必要です。
文字列を渡した場合
指定した文字列と同じ名前のインデックスを削除する。
カラム名では無いので注意
$table->dropIndex('books_title_index');
文字列の配列を渡した場合
先のインデックス名の生成ルールで作成したインデックス名を削除します。
$table->dropIndex(['title']);
この例の場合、books_title_index
という名前のインデックスを削除します。
複数の要素を持つ配列を渡した場合、その要素をカラム名とする複合インデックスを削除します。
複合インデックスの場合、配列で指定したカラムの順序がインデックス名にも影響するので、削除する際にもその順序を守る必要があります。
まとめ
ドキュメントはよく読みましょう。