스키마 빌더(Schema Builder)

소개

라라벨의 Schema 클래스는 데이터베이스에 의존하지 않는 테이블 조작 방법을 제공합니다. 이 기능은 라라벨이 지원하는 모든 데이터베이스에서 잘 동작하며 공통의 API를 가지고 있다는 것을 의미합니다.

클릭하여 의견을 공유할 수 있습니다. ( 총 개의 의견이 있습니다. )

테이블 생성 & 삭제

새로운 데이터베이스 테이블을 생성하기 위해서는 Schema::create 메소드를 사용합니다:

Schema::create('users', function($table)
{
    $table->increments('id');
});

create 메소드의 첫 번째 인자는 테이블 이름을 나타내고 두 번째 인자는 새로운 테이블을 정의하는 데 사용되는 Blueprint 객체를받는 Closure입니다.

존재하는 데이터베이스 테이블 이름을 바꾸기 위해서는 rename 메소드를 사용하면 됩니다:

Schema::rename($from, $to);

스키마 작업이 진행될 위치를 지정하고자 한다면 Schema::connection 메소드를 사용하면 됩니다:

Schema::connection('foo')->create('users', function($table)
{
    $table->increments('id');
});

테이블을 삭제하려면 Scheme::drop 메소드를 사용하면 됩니다:

Schema::drop('users');

Schema::dropIfExists('users');
클릭하여 의견을 공유할 수 있습니다. ( 총 개의 의견이 있습니다. )

컬럼 추가하기

존재하는 테이블을 수정하라면 Schema::table 메소드를 사용하게 될것입니다:

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

테이블 빌더에는 테이블을 만들 때 사용할 수 있는 다양한 컬럼의 종류들을 가지고 있습니다:

명령어 설명
$table->bigIncrements('id'); 증가 ID를 “big integer”로 하는것
$table->bigInteger('votes'); 테이블에 BIGINT 컬럼을 지정하는것
$table->binary('data'); 테이블에 BLOB 컬럼 지정
$table->boolean('confirmed'); 테이블에 BOOLEAN 컬럼 지정
$table->char('name', 4); 길이를 지정한 CHAR 타입을 지정
$table->date('created_at'); 테이블에 DATE 타입 지정
$table->dateTime('created_at'); 테이블에 DATETIME 타입 지정
$table->decimal('amount', 5, 2); 유효성과 크기 지정한 DECIMAL 타입 지정
$table->double('column', 15, 8); 전체 15자리에 소수점 8자리까지 허용가능한 DOUBLE 타입 지정
$table->enum('choices', ['foo', 'bar']); 테이블에 ENUM 타입 지정
$table->float('amount'); 테이블에 FLOAT 타입 지정
$table->increments('id'); 테이블에 (primary key) ID 증가시키기
$table->integer('votes'); 테이블에 INTEGER 타입 지정
$table->json('options'); 테이블에 JSON 타입 지정
$table->jsonb('options'); 테이블에 JSONB 타입 지정
$table->longText('description'); 테이블에 LONGTEXT 타입 지정
$table->mediumInteger('numbers'); 테이블에 MEDIUMINT 타입 지정
$table->mediumText('description'); 테이블에 MEDIUMTEXT 타입 지정
$table->morphs('taggable'); INTERGER의 taggable_id와 문자열 taggable_type타입 추가
$table->nullableTimestamps(); NULL값을 허용하는것 이외에 timestamps()와 동일합니다
$table->smallInteger('votes'); 테이블에 SMALLINT 지정
$table->tinyInteger('numbers'); 테이블에 TINYINT 지정
$table->softDeletes(); soft deletes을 위한 deleted_at 컬럼 추가
$table->string('email'); VARCHAR 타입 지정
$table->string('name', 100); 길이를 지정한 VARCHAR 타입 지정
$table->text('description'); 테이블에 TEXT 타입 지정
$table->time('sunrise'); 테이블에 TIME 타입 지정
$table->timestamp('added_on'); 테이블에 TIMESTAMP 타입 지정
$table->timestamps(); created_atupdated_at 컬럼 추가
$table->rememberToken(); VARCHAR(100) NULL의 remember_token 추가
->nullable() 컬럼에 NULL 허용
->default($value) 컬럼의 기본값 설정
->unsigned() INTEGER를 UNSIGNED로 지정

Mysql에서 After 사용하기

만약 MySQL 데이터베이스를 사용하고 있다면 컬럼의 순서지정을 위해서 after 메소드를 사용할 수 있습니다:

$table->string('name')->after('email');
클릭하여 의견을 공유할 수 있습니다. ( 총 개의 의견이 있습니다. )

컬럼 변경

** 주의:** 컬럼을 변경하기 전에 composer.jsondoctrine/dbal 의존 패키지를 추가했는지 확인하십시오.

때로는 이미 생성된 컬럼을 수정해야 할 필요가 있습니다. 예를 들어, 문자열 컬럼의 사이즈를 늘리고자 할 경우가 그렇습니다. change 메소드가 이 역할을 수행합니다! 예를 들어, 다음 예제는 name 컬럼의 사이즈를 25에서 50으로 늘려줍니다:

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

또한, 다음처럼 컬럼에 Null 값이 가능하게 변경할 수도 있습니다:

Schema::table('users', function($table)
{
    $table->string('name', 50)->nullable()->change();
});
클릭하여 의견을 공유할 수 있습니다. ( 총 개의 의견이 있습니다. )

컬럼 이름 변경

컬럼의 이름을 변경하기 위해서는 스키마 빌더에서 renameColumn 메소드를 사용하면 됩니다. 컬럼이름을 변경하기 전에 composer.jsondoctrine/dbal 의존성을 추가했는지 확인하십시오.

(역자주 컬럼 이름 변경을 사용하기 위해서는 composer.json의 require에 doctrine/dbal을 추가해서 composer를 업데이트 해준 상태여야 합니다.)

Schema::table('users', function($table)
{
    $table->renameColumn('from', 'to');
});

주의 : 현재 enum 컬럼 타입의 이름을 변경하는 것은 지원되지 않습니다.

클릭하여 의견을 공유할 수 있습니다. ( 총 개의 의견이 있습니다. )

컬럼 삭제

컬럼을 삭제하고자 한다면 스키마 빌더에서 dropColumn 메소드를 사용하면 됩니다. 앞서 컬럼 이름 변경과 마찬가지로 컬럼 삭제 작업을 수행하기 전에 composer.jsondoctrine/dbal 의존성을 추가해주어야 합니다.

데이터베이스 테이블에서 컬럼 삭제하기

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

데이터베이스 테이블에서 다수의 컬럼 삭제하기

Schema::table('users', function($table)
{
    $table->dropColumn(['votes', 'avatar', 'location']);
});
클릭하여 의견을 공유할 수 있습니다. ( 총 개의 의견이 있습니다. )

존재 유무 확인

테이블이 존재하는지 확인하기

테이블이나 컬럼이 존재하는지 확인하는 것은 hasTablehasColumn 메소드르 사용하여 쉽게 확인할 수 있습니다:

if (Schema::hasTable('users'))
{
    //
}

컬럼이 존재하는지 확인하기

if (Schema::hasColumn('users', 'email'))
{
    //
}
클릭하여 의견을 공유할 수 있습니다. ( 총 개의 의견이 있습니다. )

인덱스 추가하기

스키마 빌더는 여러 가지 타입의 인덱스들을 지원합니다. 인덱스를 추가하는 데에는 두 가지 방법이 있습니다. 첫 번째는 컬럼을 정의하면서 동시에 인덱스를 추가하는 것이고, 두 번째는 이를 분리해서 작업하는 것입니다: $table->string('email')->unique();

인덱스를 추가하는 것을 라인을 나눠서 할 수도 있습니다. 아래의 예는 사용할 수 있는 인덱스 타입들의 목록입니다:

명령어 설명
$table->primary('id'); Primary 키 추가
$table->primary(['first', 'last']); 복합키 추가
$table->unique('email'); 유니크 인덱스 추가
$table->index('state'); 기본 인덱스 추가
클릭하여 의견을 공유할 수 있습니다. ( 총 개의 의견이 있습니다. )

외래키

라라벨은 테이블에 외래키 제약을 거는것도 지원합니다:

$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');

이 예에서 user_id 컬럼이users테이블에 id컬럼을 참조한다는 것을 선언 하고 있습니다. 외래키 컬럼을 먼저 생성하는것을 잊지 마십시오!

또한, 외래키 옵션인 "on delete”와 "on update"에 대한 처리를 지정할 수 있습니다:

$table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');

외래키를 삭제하려면 dropForeign 메소드를 사용하면 됩니다. 다른 인덱스에서 사용되는 것과 유사한 인덱스 이름 명명 규칙이 외래 키에도 사용되고 있습니다:

$table->dropForeign('posts_user_id_foreign');

주의: 정수형 증분되는 값(incrementing integer)을 참조하여 외래키를 만들때 외래키 컬럼을 항상 unsigned로 만드는 것을 유의해야 합니다.

클릭하여 의견을 공유할 수 있습니다. ( 총 개의 의견이 있습니다. )

인덱스 삭제하기

인덱스를 삭제하려면 인덱스 이름을 지정해야 합니다. 라라벨은 기본적으로 인덱스에 자체적인 의미가 있는 이름을 할당한다. 간단하게 테이블 이름, 인덱스가 있는 컬럼의 이름, 인데스 타입을 연결한 것입니다. 몇 가지 예제입니다:

명령어 설명
$table->dropPrimary('users_id_primary'); “users” 테이블에서 Primary 키 삭제
$table->dropUnique('users_email_unique'); “users” 테이블에서 유니크 인덱스 삭제
$table->dropIndex('geo_state_index'); “geo” 테이블에서 기본 인덱스 삭제
클릭하여 의견을 공유할 수 있습니다. ( 총 개의 의견이 있습니다. )

Timestamps와 softDeletes 컬럼 삭제

timestamps, nullableTimestamps, softDeletes타입의 컬럼을 삭제하려면 다음과 같은 메소드들을 사용합니다:

명령어 설명
$table->dropTimestamps(); 테이블에서 created_atupdated_at 컬럼을 삭제
$table->dropSoftDeletes(); 테이블에서 deleted_at 컬럼을 삭제
클릭하여 의견을 공유할 수 있습니다. ( 총 개의 의견이 있습니다. )

스토리지 엔진

테이블에 스토리지 엔진을 지정하려면 스키마 빌더에서 engine 속성을 지정하면 됩니다:

Schema::create('users', function($table)
{
    $table->engine = 'InnoDB';

    $table->string('email');
});
클릭하여 의견을 공유할 수 있습니다. ( 총 개의 의견이 있습니다. )