移行の準備時にテーブルに一意のインデックスが存在するかどうかを確認しようとすると、どのようにしてそれを達成できますか?
Schema::table('persons', function (Blueprint $table) {
if ($table->hasIndex('persons_body_unique')) {
$table->dropUnique('persons_body_unique');
}
})
上記のようなもの。 (どうやら、hasIndex()は存在しません)
Laravel=が使用する「doctrine-dbal」を使用することは、より良い解決策です:
Schema::table('persons', function (Blueprint $table) {
$sm = Schema::getConnection()->getDoctrineSchemaManager();
$indexesFound = $sm->listTableIndexes('persons');
if(array_key_exists("persons_body_unique", $indexesFound))
$table->dropUnique("persons_body_unique");
})
Mysqlクエリ
SHOW INDEXES FROM persons
テーブルのすべてのインデックスが返されますが、名前だけでなく追加情報も含まれています。私の設定では、名前を含む列はKey_name
それでは、キー名のコレクションを取得しましょう
collect(DB::select("SHOW INDEXES FROM persons"))->pluck('Key_name')
そして、そのコレクションなので、contains
を使用できるので、最終的に次のようになります。
if (collect(DB::select("SHOW INDEXES FROM persons"))->pluck('Key_name')->contains('persons_body_unique')) {
$table->dropUnique('persons_body_unique');
}
単純な形で、これを行うことができます
Schema::table('persons', function (Blueprint $table) {
$index_exists = collect(DB::select("SHOW INDEXES FROM persons"))->pluck('Key_name')->contains('persons_body_unique');
if ($index_exists) {
$table->dropUnique("persons_body_unique");
}
})