2017-08-25 2 views
2

移行を準備する際にテーブルにユニークなインデックスが存在するかどうかを確認しようとすると、どのように達成できますか?Laravelの移行中にインデックスが存在する場合、どのようにインデックスをチェックできますか?

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

何か上記のようなものです。しかし、それだけで名以外の追加情報が含まれ、

答えて

1

mysqlのクエリ

SHOW INDEXES FROM persons

バックテーブルのインデックスのすべてをあなたに与えます(どうやら、hasIndex()が存在していません)。私のセットアップでは、名前を含む列を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'); 
} 
3

」使用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"); 
}) 
関連する問題