평범한 이야기들

[TIL] PHP Laravel - Database #1 마이그레이션 본문

평범한 개발 이야기/Laravel

[TIL] PHP Laravel - Database #1 마이그레이션

songsariya 2021. 2. 8. 09:50
728x90

마이그레이션


테이블을 생성, 칼럼 추가, 인덱스와 키를 정의 하는 작업등을 데이터베이스 마이그레이션이라 부름

라라벨과 같은 모던 프레임워크에서는 마이그레이션 작업을 코드로 처리하는 기능 제공


마이그레이션 파일 생성

~ php artisan make:migration create_users_table

// 2개의 플래그존재 --create=table_name은 table_name이라는 테이블을 만드는 데 필요한 코드를 미리채워놓는다.
// --table=table_name 플래그는 기존 테이블에 대한 수정 작업을 위한 파일을 작성하 할 때 사용
~ php artisan make:migration add_votes_to_users_table --table=users
~ php artisan make:migration add_votes_to_users_table --create=users

Scheme 퍼사드의 create메서드를 이용해 테이블을 생성한

Schema::crate('users', function(Blueprint $table){
    // Create columns here
    $table->string('name'); // name 이라는 컬럼을 생성
});

컬럼 추가 / 생성

데이터 형에 따른 다양한 메서드가 존재한다.

  • integer(colName) : Int형
  • string(colName, length) : length 길이를 갖는 varchar형
  • boolean(colName) : boolean 타입을 갖는 컬럼
  • 그 외에도 다양한 데이터형에 맞게 존재 → 참고 (라라벨코리아 문서)

특수 메서드

  • increments(colName) : integer 타입을 auto_increment 지정된 기본 키로 추가
  • bigIncrements(colName) : BigInteger 타입을 auto_increment 지정된 기본 키로 추가 → id(colName)과 동일
  • 그 외에도 여러개 존재 → 참고 (라라벨코리아 문서)

체이닝 형태로 구성해도 된다.

Schema::table('users',function(Blueprint $table){
    $table->string('email')->nullable()->after('last_name');
});

테이블 삭제

// 테이블이 존재하면 삭제한다.
Schema::dropIfExists('users');

칼럼 수정

Schema::**table**('users',function(Blueprint $table){
    $table->string('name',100)->change();
});

칼럼삭제

Schema::**table**('users',function(Blueprint $table){
    $table->dropColumn('name');
});

// 배열로 전달하면 여러 개의 컬럼을 삭제 가능
Schema::**table**('users',function(Blueprint $table){
    $table->dropColumn(['name','email']);
});

인덱스

인덱스 생성

$table->primary('primary_id'); // 기본 키, increments()를 사용한다면 불 필요
$table->primary(['first_name','last_name'); // 복합 키를 구성하는 경우
$table->unique('email'); // 유니크 인덱스 설정
$table->unique('email', 'optional_custom_index_name'); // 이름을 지정한 유니크 인덱스 설정
$table->index('email'); // 기본 인덱스 설정
$table->index('email', 'optional_custom_index_name'); // 이름을 지정한 기본 인덱스 설정

인덱스 삭제

$table->dropPrimary('contacts_id_primary');
$table->dropUnique('contacts_id_primary');
$table->dropIndex('contacts_id_primary');

외래 키

외래키 추가

// user_id 컬럼에 users 테이블의 id를 참조하는 외래 키 추가
$table->foreign('user_id')->references('id')->on('users');

//라라벨7이상에서
$table->foreignId('user_id')->constrained();

외래 키의 제약 지정

onUpdate() onDelete 메서드 이용

// 외래 키의 제약을 지정하는 방법
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

//라라벨7이상
$table->foreignId('user_id')->constrained()->onUpdate('cascade');

외래키삭제

// 인덱스의 이름(참조되는 칼럼의 이름과 테이블명을 기반으로 자동으로 생성) 지정해서 사용
$table->dropForeign('contacts_user_id_foreign');

// 참조하는 칼럼을 배열에 넣어서 삭제가능
$table->dropForeign(['user_id']);

마이그레이션 실행

~ php artisan migrate

마이그레이션의 up() 메서드 내용이 데이터베이스에 적용

기존에 적용한 내용은 제외 ( 즉 마이그레이션 내용을 DB에 저장해서 관리해줌)

그 외 마이그레이션 명령어 옵션

  • migrate:install : 어떤 마이그레이션을 실행했는지 저장하는 테이블을 생성 - 마이그레이션을 실행할 때 자동으로 실행됨
  • migrate:reset : 적용된 마이그레이션을 되돌린다.
  • migrate:refresh : 적용된 전체 마이그레이션을 되돌린 후 다시 마이그레이션을 적용 (migrate:reset 후 migrate 한 것과 동일)
  • migrate:fresh : 모든 테이블을 삭제하고 전체 마이그레이션을 다시 적용 ( refresh와 동일하지만 down()메서 내용을 실행하는 것이 아닌 테이블 삭제 후 up() 메서드 실행)
  • migrate:rollback : 가장 최근에 적용한 마이그레이션 내용을 롤백함. —step=n 옵션으로 되돌릴 횟수를 지정 가능
  • migrate:status : 모든 마이그레이션 목록을 보여줌
728x90
Comments