데이터베이스: 마이그레이션
소개
마이그레이션은 데이터베이스에 대한 버전 관리와 같아서 팀에서 애플리케이션의 데이터베이스 스키마 정의를 정의하고 공유할 수 있습니다. 소스 제어에서 변경 사항을 가져온 후 팀원에게 로컬 데이터베이스 스키마에 수동으로 열을 추가하라고 말해야 했다면 데이터베이스 마이그레이션이 해결하는 문제에 직면한 것입니다.
Laravel Schema 파사드는 Laravel에서 지원하는 모든 데이터베이스 시스템에서 테이블을 생성하고 조작하기 위한 데이터베이스 독립적인 지원을 제공합니다. 일반적으로 마이그레이션은 이 파사드를 사용하여 데이터베이스 테이블과 열을 생성하고 수정합니다.
마이그레이션 생성
make:migration Artisan 명령어를 사용하여 데이터베이스 마이그레이션을 생성할 수 있습니다. 새로운 마이그레이션은 database/migrations 디렉토리에 배치됩니다. 각 마이그레이션 파일 이름에는 Laravel이 마이그레이션 순서를 결정할 수 있도록 타임스탬프가 포함되어 있습니다.
php artisan make:migration create_flights_table
Laravel은 마이그레이션 이름을 사용하여 테이블 이름과 마이그레이션이 새 테이블을 생성하는지 여부를 추측하려고 시도합니다. Laravel이 마이그레이션 이름에서 테이블 이름을 확인할 수 있는 경우, Laravel은 생성된 마이그레이션 파일을 지정된 테이블로 미리 채웁니다. 그렇지 않으면 마이그레이션 파일에서 테이블을 수동으로 지정하면 됩니다.
생성된 마이그레이션에 대한 사용자 정의 경로를 지정하려면 make:migration 명령을 실행할 때 --path 옵션을 사용할 수 있습니다. 제공된 경로는 애플리케이션의 기본 경로를 기준으로 해야 합니다.
마이그레이션 스텁은 스텁 게시를 사용하여 사용자 정의할 수 있습니다.
마이그레이션 압축
애플리케이션을 빌드하는 동안 시간이 지남에 따라 점점 더 많은 마이그레이션이 누적될 수 있습니다. 이로 인해 database/migrations 디렉토리가 잠재적으로 수백 개의 마이그레이션으로 부풀어 오를 수 있습니다. 원하는 경우 마이그레이션을 단일 SQL 파일로 "압축"할 수 있습니다. 시작하려면 schema:dump 명령을 실행합니다.
php artisan schema:dump # 현재 데이터베이스 스키마를 덤프하고 기존 마이그레이션 모두를 정리합니다...php artisan schema:dump --prune
이 명령을 실행하면 Laravel은 애플리케이션의 database/schema 디렉토리에 "schema" 파일을 작성합니다. 스키마 파일의 이름은 데이터베이스 연결에 해당합니다. 이제 데이터베이스를 마이그레이션하려고 시도하고 다른 마이그레이션이 실행되지 않은 경우, Laravel은 먼저 사용 중인 데이터베이스 연결의 스키마 파일에 있는 SQL 문을 실행합니다. 스키마 파일의 SQL 문을 실행한 후, Laravel은 스키마 덤프에 포함되지 않은 나머지 마이그레이션을 실행합니다.
애플리케이션의 테스트가 로컬 개발 중에 일반적으로 사용하는 것과 다른 데이터베이스 연결을 사용하는 경우, 테스트에서 데이터베이스를 빌드할 수 있도록 해당 데이터베이스 연결을 사용하여 스키마 파일을 덤프했는지 확인해야 합니다. 로컬 개발 중에 일반적으로 사용하는 데이터베이스 연결을 덤프한 후 다음과 같이 할 수 있습니다:
php artisan schema:dumpphp artisan schema:dump --database=testing --prune
데이터베이스 스키마 파일을 소스 제어에 커밋하여 팀의 다른 새로운 개발자가 애플리케이션의 초기 데이터베이스 구조를 빠르게 생성할 수 있도록 해야 합니다.
마이그레이션 스쿼싱은 MariaDB, MySQL, PostgreSQL 및 SQLite 데이터베이스에서만 사용할 수 있으며 데이터베이스의 명령줄 클라이언트를 활용합니다.
마이그레이션 구조
마이그레이션 클래스에는 up과 down이라는 두 가지 메서드가 있습니다. up 메서드는 데이터베이스에 새로운 테이블, 열 또는 인덱스를 추가하는 데 사용되며, down 메서드는 up 메서드에서 수행한 작업을 되돌려야 합니다.
이러한 두 메서드 내에서 Laravel 스키마 빌더를 사용하여 표현적으로 테이블을 생성하고 수정할 수 있습니다. Schema 빌더에서 사용할 수 있는 모든 메서드에 대해 알아보려면 해당 문서를 확인하십시오. 예를 들어 다음 마이그레이션은 flights 테이블을 생성합니다.
<?php use Illuminate\Database\Migrations\Migration;use Illuminate\Database\Schema\Blueprint;use Illuminate\Support\Facades\Schema; return new class extends Migration{ /** * 마이그레이션 실행. */ public function up(): void { Schema::create('flights', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('airline'); $table->timestamps(); }); } /** * 마이그레이션 되돌리기. */ public function down(): void { Schema::drop('flights'); }};
마이그레이션 연결 설정
마이그레이션이 애플리케이션의 기본 데이터베이스 연결이 아닌 다른 데이터베이스 연결과 상호 작용하는 경우, 마이그레이션의 $connection 속성을 설정해야 합니다.
/** * 마이그레이션에서 사용해야 하는 데이터베이스 연결. * * @var string */protected $connection = 'pgsql'; /** * 마이그레이션 실행. */public function up(): void{ // ...}
마이그레이션 실행
보류 중인 모든 마이그레이션을 실행하려면 migrate Artisan 명령을 실행하십시오.
php artisan migrate
지금까지 실행된 마이그레이션을 확인하려면 migrate:status Artisan 명령어를 사용할 수 있습니다:
php artisan migrate:status
마이그레이션을 실제로 실행하지 않고 실행될 SQL 구문을 확인하려면 migrate 명령어에 --pretend 플래그를 제공하면 됩니다:
php artisan migrate --pretend
마이그레이션 실행 격리
여러 서버에 애플리케이션을 배포하고 배포 프로세스의 일부로 마이그레이션을 실행하는 경우, 두 서버가 동시에 데이터베이스 마이그레이션을 시도하는 것을 원하지 않을 것입니다. 이를 방지하기 위해 migrate 명령어를 호출할 때 isolated 옵션을 사용할 수 있습니다.
isolated 옵션이 제공되면 Laravel은 마이그레이션을 실행하기 전에 애플리케이션의 캐시 드라이버를 사용하여 원자적 잠금을 획득합니다. 해당 잠금이 유지되는 동안 migrate 명령어를 실행하려는 다른 모든 시도는 실행되지 않습니다. 그러나 명령어는 여전히 성공적인 종료 상태 코드로 종료됩니다:
php artisan migrate --isolated
이 기능을 활용하려면 애플리케이션의 기본 캐시 드라이버로 memcached, redis, dynamodb, database, file 또는 array 캐시 드라이버를 사용해야 합니다. 또한 모든 서버가 동일한 중앙 캐시 서버와 통신해야 합니다.
프로덕션에서 마이그레이션 강제 실행
일부 마이그레이션 작업은 파괴적이며, 이는 데이터 손실을 유발할 수 있음을 의미합니다. 프로덕션 데이터베이스에 대해 이러한 명령어를 실행하는 것을 방지하기 위해 명령어가 실행되기 전에 확인 메시지가 표시됩니다. 프롬프트 없이 명령어를 강제로 실행하려면 --force 플래그를 사용하십시오:
php artisan migrate --force
마이그레이션 롤백
최신 마이그레이션 작업을 롤백하려면 rollback Artisan 명령어를 사용할 수 있습니다. 이 명령어는 여러 마이그레이션 파일을 포함할 수 있는 마지막 "배치"의 마이그레이션을 롤백합니다.
php artisan migrate:rollback
rollback 명령어에 step 옵션을 제공하여 제한된 수의 마이그레이션을 롤백할 수 있습니다. 예를 들어, 다음 명령어는 마지막 5개의 마이그레이션을 롤백합니다.
php artisan migrate:rollback --step=5
rollback 명령어에 batch 옵션을 제공하여 특정 "배치"의 마이그레이션을 롤백할 수 있으며, 여기서 batch 옵션은 애플리케이션의 migrations 데이터베이스 테이블 내의 배치 값에 해당합니다. 예를 들어, 다음 명령어는 배치 3의 모든 마이그레이션을 롤백합니다.
php artisan migrate:rollback --batch=3
마이그레이션에 의해 실행될 SQL 문을 실제로 실행하지 않고 보려면 migrate:rollback 명령어에 --pretend 플래그를 제공하면 됩니다.
php artisan migrate:rollback --pretend
migrate:reset 명령어는 애플리케이션의 모든 마이그레이션을 롤백합니다.
php artisan migrate:reset
단일 명령어를 사용하여 롤백 및 마이그레이션
migrate:refresh 명령어는 모든 마이그레이션을 롤백한 다음 migrate 명령어를 실행합니다. 이 명령어는 데이터베이스 전체를 효과적으로 다시 생성합니다.
php artisan migrate:refresh # 데이터베이스를 새로 고치고 모든 데이터베이스 시드를 실행합니다...php artisan migrate:refresh --seed
refresh 명령어에 step 옵션을 제공하여 제한된 수의 마이그레이션을 롤백하고 다시 마이그레이션할 수 있습니다. 예를 들어, 다음 명령어는 마지막 5개의 마이그레이션을 롤백하고 다시 마이그레이션합니다.
php artisan migrate:refresh --step=5
모든 테이블 삭제 및 마이그레이션
migrate:fresh 명령어는 데이터베이스에서 모든 테이블을 삭제한 다음 migrate 명령어를 실행합니다:
php artisan migrate:fresh php artisan migrate:fresh --seed
기본적으로 migrate:fresh 명령어는 기본 데이터베이스 연결에서만 테이블을 삭제합니다. 그러나 마이그레이션할 데이터베이스 연결을 지정하기 위해 --database 옵션을 사용할 수 있습니다. 데이터베이스 연결 이름은 애플리케이션의 database 구성 파일에 정의된 연결과 일치해야 합니다:
php artisan migrate:fresh --database=admin
[!경고]
migrate:fresh명령어는 접두사에 관계없이 모든 데이터베이스 테이블을 삭제합니다. 이 명령어는 다른 애플리케이션과 공유하는 데이터베이스에서 개발할 때 주의해서 사용해야 합니다.
테이블
테이블 생성
새 데이터베이스 테이블을 생성하려면 Schema 파사드에서 create 메서드를 사용하세요. create 메서드는 두 개의 인수를 받습니다. 첫 번째 인수는 테이블 이름이고, 두 번째 인수는 새 테이블을 정의하는 데 사용할 수 있는 Blueprint 객체를 받는 클로저입니다.
use Illuminate\Database\Schema\Blueprint;use Illuminate\Support\Facades\Schema; Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email'); $table->timestamps();});
테이블을 생성할 때 스키마 빌더의 컬럼 메서드를 사용하여 테이블의 컬럼을 정의할 수 있습니다.
테이블 / 컬럼 존재 여부 확인
hasTable, hasColumn, hasIndex 메서드를 사용하여 테이블, 컬럼 또는 인덱스의 존재 여부를 확인할 수 있습니다.
if (Schema::hasTable('users')) { // "users" 테이블이 존재합니다...} if (Schema::hasColumn('users', 'email')) { // "users" 테이블이 존재하고 "email" 컬럼이 있습니다...} if (Schema::hasIndex('users', ['email'], 'unique')) { // "users" 테이블이 존재하고 "email" 컬럼에 고유 인덱스가 있습니다...}
데이터베이스 연결 및 테이블 옵션
애플리케이션의 기본 연결이 아닌 데이터베이스 연결에서 스키마 작업을 수행하려면 connection 메서드를 사용하세요.
Schema::connection('sqlite')->create('users', function (Blueprint $table) { $table->id();});
또한 몇 가지 다른 속성과 메서드를 사용하여 테이블 생성의 다른 측면을 정의할 수 있습니다. MariaDB 또는 MySQL을 사용할 때 engine 속성을 사용하여 테이블의 스토리지 엔진을 지정할 수 있습니다.
Schema::create('users', function (Blueprint $table) { $table->engine('InnoDB'); // ...});
MariaDB 또는 MySQL을 사용할 때 charset 및 collation 속성을 사용하여 생성된 테이블의 문자 집합 및 콜렉션을 지정할 수 있습니다.
Schema::create('users', function (Blueprint $table) { $table->charset('utf8mb4'); $table->collation('utf8mb4_unicode_ci'); // ...});
temporary 메서드를 사용하여 테이블이 "임시" 테이블이어야 함을 나타낼 수 있습니다. 임시 테이블은 현재 연결의 데이터베이스 세션에서만 볼 수 있으며 연결이 닫히면 자동으로 삭제됩니다.
Schema::create('calculations', function (Blueprint $table) { $table->temporary(); // ...});
데이터베이스 테이블에 "주석"을 추가하려면 테이블 인스턴스에서 comment 메서드를 호출할 수 있습니다. 테이블 주석은 현재 MariaDB, MySQL 및 PostgreSQL에서만 지원됩니다.
Schema::create('calculations', function (Blueprint $table) { $table->comment('Business calculations'); // ...});
테이블 업데이트
Schema 파사드의 table 메서드를 사용하여 기존 테이블을 업데이트할 수 있습니다. create 메서드와 마찬가지로 table 메서드는 두 개의 인수를 받습니다. 테이블 이름과 테이블에 컬럼이나 인덱스를 추가하는 데 사용할 수 있는 Blueprint 인스턴스를 받는 클로저입니다.
use Illuminate\Database\Schema\Blueprint;use Illuminate\Support\Facades\Schema; Schema::table('users', function (Blueprint $table) { $table->integer('votes');});
테이블 이름 변경 / 삭제
기존 데이터베이스 테이블의 이름을 변경하려면 rename 메서드를 사용하세요.
use Illuminate\Support\Facades\Schema; Schema::rename($from, $to);
기존 테이블을 삭제하려면 drop 또는 dropIfExists 메서드를 사용할 수 있습니다.
Schema::drop('users'); Schema::dropIfExists('users');
외래 키가 있는 테이블 이름 변경
테이블 이름을 변경하기 전에 Laravel이 규칙 기반 이름을 할당하도록 하는 대신 마이그레이션 파일에 테이블의 외래 키 제약 조건에 명시적인 이름이 있는지 확인해야 합니다. 그렇지 않으면 외래 키 제약 조건 이름이 이전 테이블 이름을 참조합니다.
컬럼
컬럼 생성
Schema 파사드의 table 메서드를 사용하여 기존 테이블을 업데이트할 수 있습니다. create 메서드와 마찬가지로 table 메서드는 두 개의 인수를 받습니다. 테이블 이름과 테이블에 컬럼을 추가하는 데 사용할 수 있는 Illuminate\Database\Schema\Blueprint 인스턴스를 받는 클로저입니다.
use Illuminate\Database\Schema\Blueprint;use Illuminate\Support\Facades\Schema; Schema::table('users', function (Blueprint $table) { $table->integer('votes');});
사용 가능한 컬럼 유형
스키마 빌더 청사진은 데이터베이스 테이블에 추가할 수 있는 다양한 컬럼 유형에 해당하는 다양한 메서드를 제공합니다. 사용 가능한 각 메서드는 아래 표에 나와 있습니다.
bigIncrements bigInteger binary boolean char dateTimeTz dateTime date decimal double enum float foreignId foreignIdFor foreignUlid foreignUuid geography geometry id increments integer ipAddress json jsonb longText macAddress mediumIncrements mediumInteger mediumText morphs nullableMorphs nullableTimestamps nullableUlidMorphs nullableUuidMorphs rememberToken set smallIncrements smallInteger softDeletesTz softDeletes string text timeTz time timestampTz timestamp timestampsTz timestamps tinyIncrements tinyInteger tinyText unsignedBigInteger unsignedInteger unsignedMediumInteger unsignedSmallInteger unsignedTinyInteger ulidMorphs uuidMorphs ulid uuid vector year
bigIncrements()
bigIncrements 메서드는 자동 증가하는 UNSIGNED BIGINT (기본 키)에 해당하는 컬럼을 생성합니다.
$table->bigIncrements('id');
bigInteger()
bigInteger 메서드는 BIGINT에 해당하는 컬럼을 생성합니다.
$table->bigInteger('votes');
binary()
binary 메서드는 BLOB에 해당하는 컬럼을 생성합니다.
$table->binary('photo');
MySQL, MariaDB 또는 SQL Server를 사용하는 경우 length 및 fixed 인수를 전달하여 VARBINARY 또는 BINARY에 해당하는 컬럼을 만들 수 있습니다.
$table->binary('data', length: 16); // VARBINARY(16) $table->binary('data', length: 16, fixed: true); // BINARY(16)
boolean()
boolean 메서드는 BOOLEAN에 해당하는 컬럼을 생성합니다.
$table->boolean('confirmed');
char()
char 메서드는 지정된 길이의 CHAR에 해당하는 컬럼을 생성합니다.
$table->char('name', length: 100);
dateTimeTz()
dateTimeTz 메서드는 선택적 소수 초 정밀도를 사용하여 DATETIME (시간대 포함)에 해당하는 컬럼을 생성합니다.
$table->dateTimeTz('created_at', precision: 0);
dateTime()
dateTime 메서드는 선택적 소수 초 정밀도를 사용하여 DATETIME에 해당하는 컬럼을 생성합니다.
$table->dateTime('created_at', precision: 0);
date()
date 메서드는 DATE에 해당하는 컬럼을 생성합니다.
$table->date('created_at');
decimal()
decimal 메서드는 지정된 정밀도(총 자릿수) 및 스케일(소수 자릿수)을 사용하여 DECIMAL에 해당하는 컬럼을 생성합니다.
$table->decimal('amount', total: 8, places: 2);
double()
double 메서드는 DOUBLE에 해당하는 컬럼을 생성합니다.
$table->double('amount');
enum()
enum 메서드는 지정된 유효한 값으로 ENUM에 해당하는 컬럼을 생성합니다.
$table->enum('difficulty', ['easy', 'hard']);
float()
float 메서드는 지정된 정밀도를 사용하여 FLOAT에 해당하는 컬럼을 생성합니다.
$table->float('amount', precision: 53);
foreignId()
foreignId 메서드는 UNSIGNED BIGINT에 해당하는 컬럼을 생성합니다.
$table->foreignId('user_id');
foreignIdFor()
foreignIdFor 메서드는 지정된 모델 클래스에 대해 {column}_id에 해당하는 컬럼을 추가합니다. 컬럼 유형은 모델 키 유형에 따라 UNSIGNED BIGINT, CHAR(36) 또는 CHAR(26)입니다.
$table->foreignIdFor(User::class);
foreignUlid()
foreignUlid 메서드는 ULID에 해당하는 컬럼을 생성합니다.
$table->foreignUlid('user_id');
foreignUuid()
foreignUuid 메서드는 UUID에 해당하는 컬럼을 생성합니다.
$table->foreignUuid('user_id');
geography()
geography 메서드는 지정된 공간 유형 및 SRID(공간 참조 시스템 식별자)를 사용하여 GEOGRAPHY에 해당하는 컬럼을 생성합니다.
$table->geography('coordinates', subtype: 'point', srid: 4326);
공간 유형에 대한 지원은 데이터베이스 드라이버에 따라 다릅니다. 데이터베이스 문서를 참조하세요. 애플리케이션에서 PostgreSQL 데이터베이스를 사용하는 경우 geography 메서드를 사용하기 전에 PostGIS 확장을 설치해야 합니다.
geometry()
geometry 메서드는 지정된 공간 유형 및 SRID(공간 참조 시스템 식별자)를 사용하여 GEOMETRY에 해당하는 컬럼을 생성합니다.
$table->geometry('positions', subtype: 'point', srid: 0);
공간 유형에 대한 지원은 데이터베이스 드라이버에 따라 다릅니다. 데이터베이스 문서를 참조하세요. 애플리케이션에서 PostgreSQL 데이터베이스를 사용하는 경우 geometry 메서드를 사용하기 전에 PostGIS 확장을 설치해야 합니다.
id()
id 메서드는 bigIncrements 메서드의 별칭입니다. 기본적으로 이 메서드는 id 컬럼을 생성하지만, 컬럼에 다른 이름을 지정하려면 컬럼 이름을 전달할 수 있습니다.
$table->id();
increments()
increments 메서드는 자동 증가하는 UNSIGNED INTEGER에 해당하는 컬럼을 기본 키로 생성합니다.
$table->increments('id');
integer()
integer 메서드는 INTEGER에 해당하는 컬럼을 생성합니다.
$table->integer('votes');
ipAddress()
ipAddress 메서드는 VARCHAR에 해당하는 컬럼을 생성합니다.
$table->ipAddress('visitor');
PostgreSQL을 사용하는 경우 INET 컬럼이 생성됩니다.
json()
json 메서드는 JSON에 해당하는 컬럼을 생성합니다.
$table->json('options');
jsonb()
jsonb 메서드는 JSONB에 해당하는 컬럼을 생성합니다.
$table->jsonb('options');
longText()
longText 메서드는 LONGTEXT에 해당하는 컬럼을 생성합니다.
$table->longText('description');
MySQL 또는 MariaDB를 사용하는 경우 binary 문자 집합을 컬럼에 적용하여 LONGBLOB에 해당하는 컬럼을 만들 수 있습니다.
$table->longText('data')->charset('binary'); // LONGBLOB
macAddress()
macAddress 메서드는 MAC 주소를 저장하기 위한 컬럼을 만듭니다. PostgreSQL과 같은 일부 데이터베이스 시스템에는 이 유형의 데이터에 대한 전용 컬럼 유형이 있습니다. 다른 데이터베이스 시스템에서는 문자열에 해당하는 컬럼을 사용합니다.
$table->macAddress('device');
mediumIncrements()
mediumIncrements 메서드는 자동 증가하는 UNSIGNED MEDIUMINT에 해당하는 컬럼을 기본 키로 생성합니다.
$table->mediumIncrements('id');
mediumInteger()
mediumInteger 메서드는 MEDIUMINT에 해당하는 컬럼을 생성합니다.
$table->mediumInteger('votes');
mediumText()
mediumText 메서드는 MEDIUMTEXT에 해당하는 컬럼을 생성합니다.
$table->mediumText('description');
MySQL 또는 MariaDB를 사용하는 경우 binary 문자 집합을 컬럼에 적용하여 MEDIUMBLOB에 해당하는 컬럼을 만들 수 있습니다.
$table->mediumText('data')->charset('binary'); // MEDIUMBLOB
morphs()
morphs 메서드는 편리한 메서드로, {column}_id에 해당하는 컬럼과 {column}_type VARCHAR에 해당하는 컬럼을 추가합니다. {column}_id의 컬럼 유형은 모델 키 유형에 따라 UNSIGNED BIGINT, CHAR(36) 또는 CHAR(26)입니다.
이 메서드는 다형성 Eloquent 관계에 필요한 컬럼을 정의할 때 사용하기 위한 것입니다. 다음 예제에서는 taggable_id 및 taggable_type 컬럼이 생성됩니다.
$table->morphs('taggable');
nullableTimestamps()
nullableTimestamps 메서드는 timestamps 메서드의 별칭입니다.
$table->nullableTimestamps(precision: 0);
nullableMorphs()
이 메서드는 morphs 메서드와 유사하지만 생성되는 컬럼은 "nullable"입니다.
$table->nullableMorphs('taggable');
nullableUlidMorphs()
이 메서드는 ulidMorphs 메서드와 유사하지만 생성되는 컬럼은 "nullable"입니다.
$table->nullableUlidMorphs('taggable');
nullableUuidMorphs()
이 메서드는 uuidMorphs 메서드와 유사하지만 생성되는 컬럼은 "nullable"입니다.
$table->nullableUuidMorphs('taggable');
rememberToken()
rememberToken 메서드는 현재 "나를 기억해 줘" 인증 토큰을 저장하기 위한 nullable, VARCHAR(100)에 해당하는 컬럼을 생성합니다.
$table->rememberToken();
set()
set 메서드는 지정된 유효한 값 목록으로 SET에 해당하는 컬럼을 생성합니다.
$table->set('flavors', ['strawberry', 'vanilla']);
smallIncrements()
smallIncrements 메서드는 자동 증가하는 UNSIGNED SMALLINT에 해당하는 컬럼을 기본 키로 생성합니다.
$table->smallIncrements('id');
smallInteger()
smallInteger 메서드는 SMALLINT에 해당하는 컬럼을 생성합니다.
$table->smallInteger('votes');
softDeletesTz()
softDeletesTz 메서드는 선택적 소수 초 정밀도를 사용하여 nullable deleted_at TIMESTAMP (시간대 포함)에 해당하는 컬럼을 추가합니다. 이 컬럼은 Eloquent의 "소프트 삭제" 기능에 필요한 deleted_at 타임스탬프를 저장하기 위한 것입니다.
$table->softDeletesTz('deleted_at', precision: 0);
softDeletes()
softDeletes 메서드는 선택적 소수 초 정밀도를 사용하여 nullable deleted_at TIMESTAMP에 해당하는 컬럼을 추가합니다. 이 컬럼은 Eloquent의 "소프트 삭제" 기능에 필요한 deleted_at 타임스탬프를 저장하기 위한 것입니다.
$table->softDeletes('deleted_at', precision: 0);
string()
string 메서드는 지정된 길이의 VARCHAR에 해당하는 컬럼을 생성합니다.
$table->string('name', length: 100);
text()
text 메서드는 TEXT에 해당하는 컬럼을 생성합니다.
$table->text('description');
MySQL 또는 MariaDB를 사용하는 경우 binary 문자 집합을 컬럼에 적용하여 BLOB에 해당하는 컬럼을 만들 수 있습니다.
$table->text('data')->charset('binary'); // BLOB
timeTz()
timeTz 메서드는 선택적 소수 초 정밀도를 사용하여 TIME (시간대 포함)에 해당하는 컬럼을 생성합니다.
$table->timeTz('sunrise', precision: 0);
time()
time 메서드는 선택적 소수 초 정밀도를 사용하여 TIME에 해당하는 컬럼을 생성합니다.
$table->time('sunrise', precision: 0);
timestampTz()
timestampTz 메서드는 선택적 소수 초 정밀도를 사용하여 TIMESTAMP (시간대 포함)에 해당하는 컬럼을 생성합니다.
$table->timestampTz('added_at', precision: 0);
timestamp()
timestamp 메서드는 선택적 소수 초 정밀도를 사용하여 TIMESTAMP에 해당하는 컬럼을 생성합니다.
$table->timestamp('added_at', precision: 0);
timestampsTz()
timestampsTz 메서드는 선택적 소수 초 정밀도를 사용하여 created_at 및 updated_at TIMESTAMP (시간대 포함)에 해당하는 컬럼을 생성합니다.
$table->timestampsTz(precision: 0);
timestamps()
timestamps 메서드는 선택적 소수 초 정밀도를 사용하여 created_at 및 updated_at TIMESTAMP에 해당하는 컬럼을 생성합니다.
$table->timestamps(precision: 0);
tinyIncrements()
tinyIncrements 메서드는 자동 증가하는 UNSIGNED TINYINT에 해당하는 컬럼을 기본 키로 생성합니다.
$table->tinyIncrements('id');
tinyInteger()
tinyInteger 메서드는 TINYINT에 해당하는 컬럼을 생성합니다.
$table->tinyInteger('votes');
tinyText()
tinyText 메서드는 TINYTEXT에 해당하는 컬럼을 생성합니다.
$table->tinyText('notes');
MySQL 또는 MariaDB를 사용하는 경우 binary 문자 집합을 컬럼에 적용하여 TINYBLOB에 해당하는 컬럼을 만들 수 있습니다.
$table->tinyText('data')->charset('binary'); // TINYBLOB
unsignedBigInteger()
unsignedBigInteger 메서드는 UNSIGNED BIGINT에 해당하는 컬럼을 생성합니다.
$table->unsignedBigInteger('votes');
unsignedInteger()
unsignedInteger 메서드는 UNSIGNED INTEGER에 해당하는 컬럼을 생성합니다.
$table->unsignedInteger('votes');
unsignedMediumInteger()
unsignedMediumInteger 메서드는 UNSIGNED MEDIUMINT에 해당하는 컬럼을 생성합니다.
$table->unsignedMediumInteger('votes');
unsignedSmallInteger()
unsignedSmallInteger 메서드는 UNSIGNED SMALLINT에 해당하는 컬럼을 생성합니다.
$table->unsignedSmallInteger('votes');
unsignedTinyInteger()
unsignedTinyInteger 메서드는 UNSIGNED TINYINT에 해당하는 컬럼을 생성합니다.
$table->unsignedTinyInteger('votes');
ulidMorphs()
ulidMorphs 메서드는 편리한 메서드로, {column}_id CHAR(26)에 해당하는 컬럼과 {column}_type VARCHAR에 해당하는 컬럼을 추가합니다.
이 메서드는 ULID 식별자를 사용하는 다형성 Eloquent 관계에 필요한 컬럼을 정의할 때 사용하기 위한 것입니다. 다음 예제에서는 taggable_id 및 taggable_type 컬럼이 생성됩니다.
$table->ulidMorphs('taggable');
uuidMorphs()
uuidMorphs 메서드는 편리한 메서드로, {column}_id CHAR(36)에 해당하는 컬럼과 {column}_type VARCHAR에 해당하는 컬럼을 추가합니다.
이 메서드는 UUID 식별자를 사용하는 다형성 Eloquent 관계에 필요한 컬럼을 정의할 때 사용하기 위한 것입니다. 다음 예제에서는 taggable_id 및 taggable_type 컬럼이 생성됩니다.
$table->uuidMorphs('taggable');
ulid()
ulid 메서드는 ULID에 해당하는 컬럼을 생성합니다.
$table->ulid('id');
uuid()
uuid 메서드는 UUID에 해당하는 컬럼을 생성합니다.
$table->uuid('id');
vector()
vector 메서드는 vector에 해당하는 컬럼을 생성합니다.
$table->vector('embedding', dimensions: 100);
year()
year 메서드는 YEAR에 해당하는 컬럼을 생성합니다.
$table->year('birth_year');
컬럼 수정자
위에 나열된 컬럼 유형 외에도 데이터베이스 테이블에 컬럼을 추가할 때 사용할 수 있는 여러 가지 컬럼 "수정자"가 있습니다. 예를 들어, 컬럼을 "nullable"로 만들려면 nullable 메서드를 사용할 수 있습니다.
use Illuminate\Database\Schema\Blueprint;use Illuminate\Support\Facades\Schema; Schema::table('users', function (Blueprint $table) { $table->string('email')->nullable();});
다음 표에는 사용 가능한 모든 컬럼 수정자가 나와 있습니다. 이 목록에는 인덱스 수정자가 포함되어 있지 않습니다.
| 수정자 | 설명 |
|---|---|
->after('column') |
다른 컬럼 "뒤에" 컬럼을 배치합니다 (MariaDB / MySQL). |
->autoIncrement() |
INTEGER 컬럼을 자동 증가 (기본 키)로 설정합니다. |
->charset('utf8mb4') |
컬럼의 문자 집합을 지정합니다 (MariaDB / MySQL). |
->collation('utf8mb4_unicode_ci') |
컬럼의 콜렉션을 지정합니다. |
->comment('my comment') |
컬럼에 주석을 추가합니다 (MariaDB / MySQL / PostgreSQL). |
->default($value) |
컬럼의 "기본" 값을 지정합니다. |
->first() |
테이블의 "처음"에 컬럼을 배치합니다 (MariaDB / MySQL). |
->from($integer) |
자동 증가 필드의 시작 값을 설정합니다 (MariaDB / MySQL / PostgreSQL). |
->invisible() |
SELECT * 쿼리에서 컬럼을 "보이지 않게" 만듭니다 (MariaDB / MySQL). |
->nullable($value = true) |
컬럼에 NULL 값을 삽입할 수 있도록 허용합니다. |
->storedAs($expression) |
저장된 생성된 컬럼을 만듭니다 (MariaDB / MySQL / PostgreSQL / SQLite). |
->unsigned() |
INTEGER 컬럼을 UNSIGNED로 설정합니다 (MariaDB / MySQL). |
->useCurrent() |
TIMESTAMP 컬럼이 CURRENT_TIMESTAMP를 기본값으로 사용하도록 설정합니다. |
->useCurrentOnUpdate() |
레코드가 업데이트될 때 TIMESTAMP 컬럼이 CURRENT_TIMESTAMP를 사용하도록 설정합니다 (MariaDB / MySQL). |
->virtualAs($expression) |
가상 생성된 컬럼을 만듭니다 (MariaDB / MySQL / SQLite). |
->generatedAs($expression) |
지정된 시퀀스 옵션을 사용하여 ID 컬럼을 만듭니다 (PostgreSQL). |
->always() |
ID 컬럼에 대한 입력에 대한 시퀀스 값의 우선 순위를 정의합니다 (PostgreSQL). |
기본 표현식
default 수정자는 값 또는 Illuminate\Database\Query\Expression 인스턴스를 허용합니다. Expression 인스턴스를 사용하면 Laravel이 값을 따옴표로 묶는 것을 방지하고 데이터베이스 특정 함수를 사용할 수 있습니다. 특히 유용한 한 가지 상황은 JSON 컬럼에 기본값을 할당해야 할 때입니다.
<?php use Illuminate\Support\Facades\Schema;use Illuminate\Database\Schema\Blueprint;use Illuminate\Database\Query\Expression;use Illuminate\Database\Migrations\Migration; return new class extends Migration{ /** * Run the migrations. */ public function up(): void { Schema::create('flights', function (Blueprint $table) { $table->id(); $table->json('movies')->default(new Expression('(JSON_ARRAY())')); $table->timestamps(); }); }};
[!경고] 기본 표현식에 대한 지원은 데이터베이스 드라이버, 데이터베이스 버전 및 필드 유형에 따라 다릅니다. 데이터베이스 문서를 참조하세요.
컬럼 순서
MariaDB 또는 MySQL 데이터베이스를 사용하는 경우 after 메서드를 사용하여 스키마의 기존 컬럼 뒤에 컬럼을 추가할 수 있습니다.
$table->after('password', function (Blueprint $table) { $table->string('address_line1'); $table->string('address_line2'); $table->string('city');});
컬럼 수정
change 메서드를 사용하면 기존 컬럼의 유형과 속성을 수정할 수 있습니다. 예를 들어, string 컬럼의 크기를 늘리고 싶을 수 있습니다. change 메서드의 작동 방식을 보려면 name 컬럼의 크기를 25에서 50으로 늘려 보겠습니다. 이를 달성하려면 컬럼의 새 상태를 정의한 다음 change 메서드를 호출하기만 하면 됩니다.
Schema::table('users', function (Blueprint $table) {```php
// 인덱스 추가... $table->bigIncrements('id')->primary()->change();
// 인덱스 삭제... $table->char('postal_code', 10)->unique(false)->change();
<a name="renaming-columns"></a>### 열 이름 변경하기 열 이름을 변경하려면 스키마 빌더에서 제공하는 `renameColumn` 메서드를 사용할 수 있습니다. Schema::table('users', function (Blueprint $table) { $table->renameColumn('from', 'to'); }); <a name="dropping-columns"></a>### 열 삭제하기 열을 삭제하려면 스키마 빌더에서 `dropColumn` 메서드를 사용할 수 있습니다. Schema::table('users', function (Blueprint $table) { $table->dropColumn('votes'); }); `dropColumn` 메서드에 열 이름 배열을 전달하여 테이블에서 여러 열을 삭제할 수 있습니다. Schema::table('users', function (Blueprint $table) { $table->dropColumn(['votes', 'avatar', 'location']); }); <a name="available-command-aliases"></a>#### 사용 가능한 명령어 별칭 라라벨은 일반적인 유형의 열을 삭제하는 것과 관련된 몇 가지 편리한 메서드를 제공합니다. 이러한 각 메서드는 아래 표에 설명되어 있습니다. <div class="overflow-auto"> | 명령어 | 설명 || ----------------------------------- | -------------------------------------------------------------------- || `$table->dropMorphs('morphable');` | `morphable_id` 및 `morphable_type` 열을 삭제합니다. || `$table->dropRememberToken();` | `remember_token` 열을 삭제합니다. || `$table->dropSoftDeletes();` | `deleted_at` 열을 삭제합니다. || `$table->dropSoftDeletesTz();` | `dropSoftDeletes()` 메서드의 별칭입니다. || `$table->dropTimestamps();` | `created_at` 및 `updated_at` 열을 삭제합니다. || `$table->dropTimestampsTz();` | `dropTimestamps()` 메서드의 별칭입니다. | </div> <a name="indexes"></a>## 인덱스 <a name="creating-indexes"></a>### 인덱스 생성하기 라라벨 스키마 빌더는 여러 유형의 인덱스를 지원합니다. 다음 예제는 새로운 `email` 열을 만들고 해당 값이 고유해야 함을 지정합니다. 인덱스를 생성하기 위해 열 정의에 `unique` 메서드를 연결할 수 있습니다. use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; Schema::table('users', function (Blueprint $table) { $table->string('email')->unique(); }); 또는 열을 정의한 후 인덱스를 생성할 수도 있습니다. 이렇게 하려면 스키마 빌더의 블루프린트에서 `unique` 메서드를 호출해야 합니다. 이 메서드는 고유 인덱스를 받아야 하는 열의 이름을 허용합니다. $table->unique('email'); 여러 열 배열을 인덱스 메서드에 전달하여 복합(또는 복합) 인덱스를 생성할 수도 있습니다. $table->index(['account_id', 'created_at']); 인덱스를 생성할 때 라라벨은 테이블, 열 이름 및 인덱스 유형을 기반으로 인덱스 이름을 자동으로 생성하지만, 메서드에 두 번째 인수를 전달하여 인덱스 이름을 직접 지정할 수 있습니다. $table->unique('email', 'unique_email'); <a name="available-index-types"></a>#### 사용 가능한 인덱스 유형 라라벨의 스키마 빌더 블루프린트 클래스는 라라벨에서 지원하는 각 유형의 인덱스를 생성하기 위한 메서드를 제공합니다. 각 인덱스 메서드는 인덱스 이름을 지정하기 위한 선택적 두 번째 인수를 허용합니다. 생략하면 이름은 인덱스에 사용된 테이블 및 열 이름과 인덱스 유형에서 파생됩니다. 사용 가능한 각 인덱스 메서드는 아래 표에 설명되어 있습니다. <div class="overflow-auto"> | 명령어 | 설명 || ------------------------------------------------ | ------------------------------------------------------------------ || `$table->primary('id');` | 기본 키를 추가합니다. || `$table->primary(['id', 'parent_id']);` | 복합 키를 추가합니다. || `$table->unique('email');` | 고유 인덱스를 추가합니다. || `$table->index('state');` | 인덱스를 추가합니다. || `$table->fullText('body');` | 전체 텍스트 인덱스(MariaDB / MySQL / PostgreSQL)를 추가합니다. || `$table->fullText('body')->language('english');` | 지정된 언어(PostgreSQL)의 전체 텍스트 인덱스를 추가합니다. || `$table->spatialIndex('location');` | 공간 인덱스(SQLite 제외)를 추가합니다. | </div> <a name="renaming-indexes"></a>### 인덱스 이름 변경하기 인덱스 이름을 변경하려면 스키마 빌더 블루프린트에서 제공하는 `renameIndex` 메서드를 사용할 수 있습니다. 이 메서드는 현재 인덱스 이름을 첫 번째 인수로, 원하는 이름을 두 번째 인수로 사용합니다. $table->renameIndex('from', 'to') <a name="dropping-indexes"></a>### 인덱스 삭제하기 인덱스를 삭제하려면 인덱스 이름을 지정해야 합니다. 기본적으로 라라벨은 테이블 이름, 인덱싱된 열 이름 및 인덱스 유형을 기반으로 인덱스 이름을 자동으로 할당합니다. 몇 가지 예는 다음과 같습니다. <div class="overflow-auto"> | 명령어 | 설명 || -------------------------------------------------------- | ------------------------------------------------------------------- || `$table->dropPrimary('users_id_primary');` | "users" 테이블에서 기본 키를 삭제합니다. || `$table->dropUnique('users_email_unique');` | "users" 테이블에서 고유 인덱스를 삭제합니다. || `$table->dropIndex('geo_state_index');` | "geo" 테이블에서 기본 인덱스를 삭제합니다. || `$table->dropFullText('posts_body_fulltext');` | "posts" 테이블에서 전체 텍스트 인덱스를 삭제합니다. || `$table->dropSpatialIndex('geo_location_spatialindex');` | "geo" 테이블에서 공간 인덱스(SQLite 제외)를 삭제합니다. | </div> 인덱스를 삭제하는 메서드에 열 배열을 전달하면 테이블 이름, 열 및 인덱스 유형을 기반으로 기존 인덱스 이름이 생성됩니다. Schema::table('geo', function (Blueprint $table) { $table->dropIndex(['state']); // 'geo_state_index' 인덱스를 삭제합니다. }); <a name="foreign-key-constraints"></a>### 외래 키 제약 조건 라라벨은 데이터베이스 수준에서 참조 무결성을 강제하는 데 사용되는 외래 키 제약 조건 생성도 지원합니다. 예를 들어 `users` 테이블의 `id` 열을 참조하는 `posts` 테이블에 `user_id` 열을 정의해 보겠습니다. use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; Schema::table('posts', function (Blueprint $table) { $table->unsignedBigInteger('user_id'); $table->foreign('user_id')->references('id')->on('users'); }); 이 구문이 다소 장황하기 때문에 라라벨은 보다 나은 개발자 경험을 제공하기 위해 규칙을 사용하는 추가적인 간결한 메서드를 제공합니다. `foreignId` 메서드를 사용하여 열을 생성할 때 위의 예제를 다음과 같이 다시 작성할 수 있습니다. Schema::table('posts', function (Blueprint $table) { $table->foreignId('user_id')->constrained(); }); `foreignId` 메서드는 `UNSIGNED BIGINT`와 동일한 열을 생성하는 반면 `constrained` 메서드는 규칙을 사용하여 참조되는 테이블과 열을 결정합니다. 테이블 이름이 라라벨 규칙과 일치하지 않으면 `constrained` 메서드에 수동으로 제공할 수 있습니다. 또한 생성된 인덱스에 할당해야 하는 이름을 지정할 수도 있습니다. Schema::table('posts', function (Blueprint $table) { $table->foreignId('user_id')->constrained( table: 'users', indexName: 'posts_user_id' ); }); 제약 조건의 "on delete" 및 "on update" 속성에 대한 원하는 동작을 지정할 수도 있습니다. $table->foreignId('user_id') ->constrained() ->onUpdate('cascade') ->onDelete('cascade'); 이러한 작업에 대해 대체적이고 표현적인 구문도 제공됩니다. <div class="overflow-auto"> | 메서드 | 설명 || ----------------------------- | ------------------------------------------------------------- || `$table->cascadeOnUpdate();` | 업데이트가 연속적으로 발생해야 합니다. || `$table->restrictOnUpdate();` | 업데이트가 제한되어야 합니다. || `$table->nullOnUpdate();` | 업데이트 시 외래 키 값을 null로 설정해야 합니다. || `$table->noActionOnUpdate();` | 업데이트 시 아무 작업도 수행하지 않습니다. || `$table->cascadeOnDelete();` | 삭제가 연속적으로 발생해야 합니다. || `$table->restrictOnDelete();` | 삭제가 제한되어야 합니다. || `$table->nullOnDelete();` | 삭제 시 외래 키 값을 null로 설정해야 합니다. || `$table->noActionOnDelete();` | 하위 레코드가 있는 경우 삭제를 방지합니다. | </div> `constrained` 메서드 전에 추가적인 [열 수정자](#column-modifiers)를 호출해야 합니다. $table->foreignId('user_id') ->nullable() ->constrained(); <a name="dropping-foreign-keys"></a>#### 외래 키 삭제하기 외래 키를 삭제하려면 삭제할 외래 키 제약 조건의 이름을 인수로 전달하여 `dropForeign` 메서드를 사용할 수 있습니다. 외래 키 제약 조건은 인덱스와 동일한 이름 지정 규칙을 사용합니다. 즉, 외래 키 제약 조건 이름은 테이블 이름과 제약 조건의 열을 기준으로 하며 "\_foreign" 접미사가 붙습니다. $table->dropForeign('posts_user_id_foreign'); 또는 외래 키를 보유하는 열 이름을 포함하는 배열을 `dropForeign` 메서드에 전달할 수 있습니다. 배열은 라라벨의 제약 조건 명명 규칙을 사용하여 외래 키 제약 조건 이름으로 변환됩니다. $table->dropForeign(['user_id']); <a name="toggling-foreign-key-constraints"></a>#### 외래 키 제약 조건 토글하기 다음 메서드를 사용하여 마이그레이션 내에서 외래 키 제약 조건을 활성화하거나 비활성화할 수 있습니다. Schema::enableForeignKeyConstraints(); Schema::disableForeignKeyConstraints(); Schema::withoutForeignKeyConstraints(function () { // 이 클로저 내에서 제약 조건이 비활성화됩니다... }); > [!WARNING]> SQLite는 기본적으로 외래 키 제약 조건을 비활성화합니다. SQLite를 사용하는 경우 마이그레이션에서 외래 키를 생성하기 전에 데이터베이스 구성에서 [외래 키 지원을 활성화](/docs/{{version}}/database#configuration)해야 합니다. <a name="events"></a>## 이벤트 편의를 위해 각 마이그레이션 작업은 [이벤트](/docs/{{version}}/events)를 디스패치합니다. 다음 이벤트는 모두 기본 `Illuminate\Database\Events\MigrationEvent` 클래스를 확장합니다. <div class="overflow-auto"> | 클래스 | 설명 || ------------------------------------------------ | --------------------------------------------------------------------- || `Illuminate\Database\Events\MigrationsStarted` | 마이그레이션 일괄 처리가 실행되려고 합니다. || `Illuminate\Database\Events\MigrationsEnded` | 마이그레이션 일괄 처리가 실행을 완료했습니다. || `Illuminate\Database\Events\MigrationStarted` | 단일 마이그레이션이 실행되려고 합니다. || `Illuminate\Database\Events\MigrationEnded` | 단일 마이그레이션이 실행을 완료했습니다. || `Illuminate\Database\Events\NoPendingMigrations` | 마이그레이션 명령에서 보류 중인 마이그레이션을 찾지 못했습니다. || `Illuminate\Database\Events\SchemaDumped` | 데이터베이스 스키마 덤프가 완료되었습니다. || `Illuminate\Database\Events\SchemaLoaded` | 기존 데이터베이스 스키마 덤프가 로드되었습니다. | </div>