En essayant de vérifier si un index unique existe sur une table lors de la préparation d'une migration, comment peut-il être réalisé?
Schema::table('persons', function (Blueprint $table) {
if ($table->hasIndex('persons_body_unique')) {
$table->dropUnique('persons_body_unique');
}
})
Quelque chose qui ressemble à ce qui précède. (apparemment, hasIndex () n'existe pas)
Utiliser "doctrine-dbal" que Laravel utilise est une meilleure solution:
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");
})
La requête mysql
SHOW INDEXES FROM persons
vous rendra tous les index de la table, mais il contient des informations supplémentaires autres que les noms. Dans ma configuration, la colonne contenant le nom s'appelle Key_name
permet donc d'obtenir une collection de noms de clés
collect(DB::select("SHOW INDEXES FROM persons"))->pluck('Key_name')
Et puisque c'est une collection, vous pouvez utiliser contains
donc finalement nous avons:
if (collect(DB::select("SHOW INDEXES FROM persons"))->pluck('Key_name')->contains('persons_body_unique')) {
$table->dropUnique('persons_body_unique');
}
Dans le formulaire simple, vous pouvez le faire
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");
}
})