web-dev-qa-db-ja.com

Laravelマイグレーションに存在する場合、インデックスをどのようにチェックできますか?

移行の準備時にテーブルに一意のインデックスが存在するかどうかを確認しようとすると、どのようにしてそれを達成できますか?

Schema::table('persons', function (Blueprint $table) {
    if ($table->hasIndex('persons_body_unique')) {
        $table->dropUnique('persons_body_unique');
    }
})

上記のようなもの。 (どうやら、hasIndex()は存在しません)

11
Oladipo

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");
})
26
admirko

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');
}
6
chiliNUT

単純な形で、これを行うことができます

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");
    }
})
0
Dipen Parmar