스키마 빌더
이 페이지의 내용
개요
Laravel은 테이블을 생성하고 수정할 수 있는 스키마 빌더 클래스 Schema
에 액세스할 수 있는 파사드 를 제공합니다. Facade는 구문을 보다 간결하게 만들고 테스트 가능성을 개선하는 클래스에 대한 정적 인터페이스입니다.
Laravel MongoDB는 Laravel Schema
파사드에서 인덱스 및 컬렉션 관리 메서드의 하위 집합을 지원합니다.
파사드에 대해 자세히 알아보려면 파사드 를 참조하세요.Laravel 문서에서 확인할 수 있습니다.
다음 섹션에서는 Laravel MongoDB 에서 사용할 수 있는 Laravel 스키마 빌더 기능을 설명하고 사용 방법의 예를 보여줍니다.
참고
Laravel MongoDB 는 인덱스 및 컬렉션 관리를 지원하지만 데이터 유효성 검사 를 위한 MongoDB JSON schema 지원 은 제외됩니다. JSON schema 유효성 검사 에 학습 보려면 서버 매뉴얼의 스키마 유효성 검사 검사를 참조하세요.
Laravel 마이그레이션 수행
Laravel 마이그레이션을 사용하면 Schema
파사드에 포함된 메서드를 실행하여 프로그래밍 방식으로 데이터베이스 스키마를 생성, 수정 및 삭제할 수 있습니다. 다음 섹션에서는 MongoDB database 를 사용할 때 마이그레이션 클래스를 작성하는 방법과 이를 실행하는 방법을 설명합니다.
마이그레이션 내에서 데이터베이스 및 컬렉션을 수정하면 애플리케이션의 일관성, 버전 제어 및 가역성을 보장하는 제어된 접근 방식이 제공됩니다.
마이그레이션 클래스 만들기
마이그레이션 클래스를 수동으로 만들거나 php artisan make:migration
명령을 사용하여 생성할 수 있습니다. 스키마를 생성하는 경우 MongoDB database 에서 스키마 변경을 수행하려면 다음과 같이 변경해야 합니다.
마이그레이션 에서 참조된 경우
Illuminate\Database\Schema\Blueprint
가져오기를MongoDB\Laravel\Schema\Blueprint
로 바꿉니다.Laravel MongoDB에서 지원하는 명령과 구문만 사용합니다.
팁
기본 데이터베이스 연결이 MongoDB database 이외의 것으로 설정된 경우, 마이그레이션이 올바른 데이터베이스를 지정하도록 다음 설정을 업데이트합니다.
connections
배열 항목의config/database.php
파일에 유효한mongodb
항목이 포함되어 있는지 확인합니다.마이그레이션 클래스의
$connection
필드에"mongodb"
를 지정합니다.
다음 예제 마이그레이션 클래스에는 다음 메서드가 포함되어 있습니다.
up()
마이그레이션 을 실행 때 컬렉션 과 인덱스 를 생성합니다.down()
마이그레이션 을 롤백할 때 컬렉션 과 컬렉션에 포함된 모든 인덱스를 삭제합니다.
declare(strict_types=1); use Illuminate\Database\Migrations\Migration; use Illuminate\Support\Facades\Schema; use MongoDB\Laravel\Schema\Blueprint; return new class extends Migration { protected $connection = 'mongodb'; /** * Run the migrations. */ public function up(): void { Schema::create('astronauts', function (Blueprint $collection) { $collection->index('name'); }); } /** * Reverse the migrations. */ public function down(): void { Schema::drop('astronauts'); } };
마이그레이션 실행 또는 롤백
클래스 파일에서 데이터베이스 마이그레이션을 실행하려면 자리 표시자를 바꾼 후 다음 명령을 실행합니다.
php artisan migrate --path=<path to your migration class file>
이 명령은 클래스 파일에서 up()
함수를 실행하여 config/database.php
파일에 지정된 데이터베이스에 컬렉션과 인덱스를 생성합니다.
마이그레이션을 롤백하려면 자리 표시자를 바꾼 후 다음 명령을 실행합니다.
php artisan migrate:rollback --path=<path to your migration class file>
이 명령은 클래스 파일에서 down()
함수를 실행하여 컬렉션 및 관련 인덱스를 삭제합니다.
Laravel 마이그레이션에 대해 자세히 알아보려면 데이터베이스: 마이그레이션 을 참조하세요. Laravel 문서에서 확인할 수 있습니다.
컬렉션 존재 여부 확인
컬렉션이 있는지 확인하려면 마이그레이션 파일의 Schema
파사드에서 hasCollection()
메서드를 호출합니다. 이를 사용하여 조건부로 마이그레이션 로직을 수행할 수 있습니다.
다음 예제 마이그레이션은 stars
이라는 컬렉션이 있는 경우 telescopes
컬렉션을 생성합니다.
$hasCollection = Schema::hasCollection('stars'); if ($hasCollection) { Schema::create('telescopes'); }
색인 관리
MongoDB 인덱스는 쿼리 결과를 검색하는 데 필요한 문서 수를 줄여 쿼리 효율성을 개선하는 데이터 구조입니다. 지리 공간적 인덱스와 같은 특정 인덱스는 데이터 쿼리 방법을 확장합니다.
인덱스를 사용하여 쿼리 성능을 향상시키려면 인덱스가 쿼리를 포함하는지 확인하세요. 인덱스 및 쿼리 최적화에 대해 자세히 알아보려면 다음 MongoDB Server 수동 항목을 참조하세요.
다음 섹션에서는 스키마 빌더를 사용하여 컬렉션에서 다양한 유형의 인덱스를 만들고 삭제하는 방법을 보여줍니다.
인덱스 만들기
인덱스를 만들려면 마이그레이션 파일 의 Schema
파사드에서 create()
메서드를 호출합니다. 컬렉션 이름과 MongoDB\Laravel\Schema\Blueprint
매개 변수를 사용하여 콜백 메서드를 전달합니다. Blueprint
인스턴스 에 대한 인덱스 생성 세부 정보를 지정합니다.
다음 예제 마이그레이션에서는 다음 컬렉션 필드에 인덱스를 생성합니다.
단일 필드 인덱스
mission_type
launch_location
및launch_date
에 대한 복합 인덱스 로,launch_date
에 내림차순 정렬 순서를 지정합니다.mission_id
필드 의 고유 인덱스 로, 인덱스 이름"unique_mission_id_idx"
을(를) 지정합니다.
VIEW OUTPUT 버튼을 클릭하면 _id
필드의 기본 인덱스를 포함하여 마이그레이션을 실행하여 생성된 인덱스를 볼 수 있습니다.
Schema::create('flights', function (Blueprint $collection) { $collection->index('mission_type'); $collection->index(['launch_location' => 1, 'launch_date' => -1]); $collection->unique('mission_id', options: ['name' => 'unique_mission_id_idx']); });
인덱스 옵션 지정
MongoDB 인덱스 옵션은 인덱스 사용 및 저장 방법을 결정합니다. Blueprint
인스턴스에서 index()
와 같은 인덱스 생성 메서드를 호출할 때 인덱스 옵션을 지정할 수 있습니다.
다음 마이그레이션 코드는 인덱스 인덱스 으로 추가하는 방법을 보여줍니다. VIEW OUTPUT 버튼을 클릭하면 _id
필드 의 기본값 인덱스 를 포함하여 마이그레이션 을 실행 하여 생성된 인덱스를 볼 수 있습니다.
Schema::create('passengers', function (Blueprint $collection) { $collection->index( 'last_name', name: 'passengers_collation_idx', options: [ 'collation' => [ 'locale' => 'de@collation=phonebook', 'numericOrdering' => true ], ], ); });
인덱스 옵션에 대해 자세히 알아보려면 MongoDB Server 매뉴얼의 모든 인덱스 유형에 대한 옵션을 참조하세요.
희소 인덱스, TTL 및 고유 인덱스 만들기
Laravel MongoDB 헬퍼 메서드를 사용하여 다음 유형의 인덱스를 생성할 수 있습니다.
지정된 필드가 포함된 문서에 대해서만 인덱스 항목을 허용하는 희소 인덱스
일정 시간이 지나면 만료되는 TTL(Time-to-Live) 인덱스
고유 인덱스: 인덱싱된 필드에 대해 중복된 값이 포함된 문서의 삽입을 방지합니다.
이러한 인덱스 유형을 만들려면 마이그레이션 파일의 Schema
파사드에서 create()
메서드를 호출합니다. create()
에 컬렉션 이름과 MongoDB\Laravel\Schema\Blueprint
매개 변수를 사용하여 콜백 메서드를 전달합니다. Blueprint
인스턴스에서 적절한 헬퍼 메서드를 호출하고 인덱스 생성 세부 정보를 전달합니다.
다음 마이그레이션 코드는 인덱스 헬퍼를 사용하여 희소 및 TTL 인덱스를 만드는 방법을 보여줍니다. VIEW OUTPUT 버튼을 클릭하면 _id
필드의 기본 인덱스를 포함하여 마이그레이션을 실행하여 생성된 인덱스를 볼 수 있습니다.
Schema::create('planets', function (Blueprint $collection) { $collection->sparse('rings'); $collection->expire('last_visible_dt', 86400); });
인덱스 옵션에서 지정하여 단일 필드 또는 복합 인덱스에 희소, TTL 및 고유 인덱스를 지정할 수 있습니다.
다음 마이그레이션 코드는 단일 필드에 세 가지 유형의 인덱스를 모두 생성하는 방법을 보여줍니다. VIEW OUTPUT 버튼을 클릭하면 _id
필드의 기본 인덱스를 포함하여 마이그레이션을 실행하여 생성된 인덱스를 볼 수 있습니다.
Schema::create('planet_systems', function (Blueprint $collection) { $collection->index('last_visible_dt', options: ['sparse' => true, 'expireAfterSeconds' => 3600, 'unique' => true]); });
이러한 인덱스에 대해 자세히 알아보려면 MongoDB Server 매뉴얼의 인덱스 속성 을 참조하세요.
지리 공간적 인덱스 만들기
MongoDB에서 지리 공간적 인덱스를 사용하면 지리 공간 좌표 데이터를 쿼리하여 포함, 교차 및 근접성에 대해 확인할 수 있습니다.
지리 공간적 인덱스를 만들려면 마이그레이션 파일 의 Schema
파사드에서 create()
메서드를 호출합니다. create()
에 컬렉션 이름과 MongoDB\Laravel\Schema\Blueprint
매개 변수를 사용하여 콜백 메서드를 전달합니다. Blueprint
인스턴스 에 대한 지리 공간적 인덱스 생성 세부 정보를 지정합니다.
다음 예시 마이그레이션 은 spaceports
컬렉션 에 2d
및 2dsphere
지리 공간적 인덱스 를 생성합니다. VIEW OUTPUT 버튼을 클릭하면 _id
필드 의 기본값 인덱스 를 포함하여 마이그레이션 을 실행 하여 생성된 인덱스를 볼 수 있습니다.
Schema::create('spaceports', function (Blueprint $collection) { $collection->geospatial('launchpad_location', '2dsphere'); $collection->geospatial('runway_location', '2d'); });
지리 공간적 인덱스에 학습 보려면 서버 매뉴얼의 지리 공간적 인덱스 를 참조하세요.
색인 제거
컬렉션 에서 인덱스를 삭제하려면 마이그레이션 파일 의 Schema
파사드에서 table()
메서드를 호출합니다. MongoDB\Laravel\Schema\Blueprint
매개 변수를 사용하여 테이블 이름과 콜백 메서드를 전달합니다. Blueprint
인스턴스 의 인덱스 이름을 사용하여 dropIndex()
메서드를 호출합니다.
참고
컬렉션을 삭제하면 MongoDB는 컬렉션과 관련된 모든 인덱스를 자동으로 삭제합니다.
다음 마이그레이션 예시에서는 flights
컬렉션에서 unique_mission_id_idx
인덱스를 삭제합니다.
Schema::table('flights', function (Blueprint $collection) { $collection->dropIndex('unique_mission_id_idx'); });