programing

인덱스가 Laravel 마이그레이션에 있는지 확인하려면 어떻게 해야 합니까?

javamemo 2023. 9. 2. 07:56
반응형

인덱스가 Laravel 마이그레이션에 있는지 확인하려면 어떻게 해야 합니까?

마이그레이션을 준비할 때 테이블에 고유 인덱스가 있는지 확인하려고 하면 어떻게 수행할 수 있습니까?

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

위와 같이 생긴 것.(분명히 hasIndex()가 없습니다.)

라라벨이 사용하는 "docrine-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");
});

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

간단한 형태로, 당신은 이것을 할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/45882990/how-can-indexes-be-checked-if-they-exist-in-a-laravel-migration

반응형