web-dev-qa-db-fra.com

Comment vérifier les index s'ils existent dans une migration Laravel?

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)

11
Oladipo

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

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

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