이번 절에서는 프로젝트를 진행하면서 필요한 스키마를 생성하고 migration 을 진행하겠습니다.

먼저 프로젝트 중간에 테이블이나 컬럼의 변경은 수시로 발생하므로 독트린의 dbal 패키지를 설치하여 스키마 변경시 에러가 발생하지 않도록 준비합니다.

$ composer require "doctrine/dbal" "~2.0"
CODE

 

우리가 만들 애플리케이션의 스키마는 다음과 같이 사용자 테이블은 프로젝트 테이블을 소유하고 있고 프로젝트 테이블은 태스트 테이블을 소유하는 관계를 갖고 있습니다.

 

Users 테이블은 있으므로 projects, tasks 테이블을 생성하기 위한 마이그레이션을 생성합니다.

$ php artisan make:migration create_project_table --create=projects
 
Created Migration: 2015_10_05_235319_create_project_table
 
$ php artisan make:migration create_task_table --create=tasks
Created Migration: 2015_10_05_235407_create_task_table
CODE

 

migration 파일 수정

2015_10_05_235319_create_project_table

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateProjectTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('projects', function (Blueprint $table) {
            $table->increments('id');
			$table->integer('user_id')->unsigned();
			$table->foreign('user_id')->references('id')->on('users');
			$table->string('name', 20);
			$table->text('description')->nullable();
			$table->boolean('public')->default(false);
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('projects');
    }
}
PHP
  • $table->increments('id'): 기본 키 컬럼명을 id 로 설정합니다.

  • $table->foreign('user_id')->references('id')->on('users'); 프로젝트는 사용자에 속하므로 user_id 참조 키를 설정합니다.

  • $table->string('name', 20): 프로젝트에 대한 상세한 설명을 기술하며 많은 내용을 작성할 수 있도록 text 컬럼을 사용합니다.

  • $table->boolean('public'): 누구나 볼 수 있는 프로젝트일 경우 true로 설정하며 기본 값은 false 입니다.

 

 이제 tasks 테이블 스키마를 작성합니다.

2015_10_05_235407_create_task_table.php

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTaskTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
	{
    Schema::create('tasks', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('project_id')->unsigned();
        $table->foreign('project_id')->references('id')->on('projects');	// 1
        $table->string('name', 20);	//2
        $table->text('description')->nullable();	//3
        $table->datetime('due_date')->nullable();	//4
        $table->enum('priority', ['낮음','보통', '높음'])->default('보통');	//5
        $table->enum('status', ['등록', '진행', '완료'])->default('등록');	//6
        $table->timestamps();
    });
	}
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('tasks');
    }
}
PHP
  • 1$table->foreign('project_id')->references('id')->on('projects'): task 는 project 에 포함되므로 참조 키를 설정합니다.

  • 2 $table->string('name', 20): task의 이름입니다.

  • 3 $table->text('description')->nullable(): 구체적인 내용을 기술하며 많은 내용을 기술할 수 있도록 text 컬럼을 사용합니다.

  • 4 $table->datetime('due_date')->nullable(): 완료 기한이 있는 task일 경우 설정하며 기한이 없을 수도 있으므로 nullable() 을 사용하여 null 값이 들어올 수 있도록 합니다.

  • 5 $table->enum('priority', ['낮음','보통', '높음'])->default('보통'): task의 우선순위를 enum 으로 지정하며 기본 값은 '보통' 입니다.

  • 6 $table->enum('status', ['등록', '진행', '완료'])->default('등록'): task의 진행 상태를 enum 으로 지정하며 기본 값은 '등록' 상태입니다.

 

애플리케이션이 동작하도록 초기 사용자를 생성하기 위해 사용자 테이블 시더를 생성합니다.

$ php artisan make:seeder  UserTableSeeder
CODE

 

이제 database/seeds/UserTableSeeder.php 파일의 run() 메소드에 초기 데이타를 생성하는 코드를 작성합니다.

use Illuminate\Database\Seeder;

class UserTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $users = [
            [
                'name' => '사용자1',
                'email' => 'user1@myhost.com',
                'password' => bcrypt('secret'),
            ],
            [
                'name' => '사용자2',
                'email' => 'user2@myhost.com',
                'password' => bcrypt('secret'),
            ],
        ];

        foreach($users as $u) {
            App\User::create($u);
        }
    }
}
PHP
  • $users: 초기 사용자로 두 명의 사용자 정보를 갖고 있는 배열을 생성합니다.
  • 'password' => bcrypt('secret') : 라라벨은 사용자의 암호를 PHP의 password_hash() 함수를 PASSWORD_BCRYPT 파라미터로 설정하여 생성하며 기본 인증 모듈(AuthController)에서도 이 알고리즘을 사용하므로 초기 데이타로 설정시에는 명시적으로 bcrypt() 헬퍼 함수를 호출해서 암호를 설정해야 합니다.

  • foreach(...): foreach 루프를 돌면서 사용자 정보를 User::create() 메소드를 사용하여 DBMS 에 입력합니다.

 

이제 시더 클래스를 구현하였으니 databases/seeds/DatabaseSeeder.php 의 run() 메소드에서 UserTableSeeder를 호출하도록 수정합니다.

databases/seeds/DatabaseSeeder.php

public function run()
{
    $this->call(UserTableSeeder::class);
}
PHP

작성한 스키마를 반영하도록 migrate를 수행하며 초기 데이타도 입력하도록 --seed 옵션을 추가합니다.

$ php artisan migrate --seed
CODE