如果索引存在于Laravel迁移中,如何检查索引?

Ola*_*ola 9 php mysql database-migration laravel

在准备迁移时,尝试检查表上是否存在唯一索引,如何实现?

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

看起来像上面的东西.(显然,hasIndex()不存在)

小智 27

使用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");
})
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`listTableIndexes()` 将以**小写** 形式返回索引名称。 (3认同)
  • 为将来的其他迁移进行复制/粘贴的小添加,您可以使用 $table 对象来获取名称。`$indexesFound = $sm->listTableIndexes($table->getTable());` (3认同)

chi*_*NUT 6

mysql查询

SHOW INDEXES FROM persons

将返回表上的所有索引,但是它不仅包含名称,还包含其他信息。在我的设置中,包含名称的列被调用,Key_name因此让我们获取键名称的集合

collect(DB::select("SHOW INDEXES FROM persons"))->pluck('Key_name')
Run Code Online (Sandbox Code Playgroud)

由于它是一个集合,您可以使用,contains所以最终我们有了:

if (collect(DB::select("SHOW INDEXES FROM persons"))->pluck('Key_name')->contains('persons_body_unique')) {
        $table->dropUnique('persons_body_unique');
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是公认的答案,因为它不是跨数据库的(“便携式”,不是特定于供应商的)。@admirko的答案要好得多,因为它遍历了Laravel的底层学说层而不是“本机查询”。 (2认同)

Dip*_*mar 5

在简单的形式中,您可以这样做

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");
    }
})
Run Code Online (Sandbox Code Playgroud)