LaravelのMigrationについて調べた結果

# LaravelのMigrationについて
	
- 公式ドキュメント
	- [https://readouble.com/laravel/5.1/ja/migrations.html](https://readouble.com/laravel/5.1/ja/migrations.html) 

- 公式ドキュメント引用

	> マイグレーションとはデータベースのバージョンコントロールのようなもので、
	> チームでアプリケーションデータベースのスキーマを簡単に更新し共有できるようにしてくれます。
	> 通常、マイグレーションはアプリケーションのデータベーススキーマを簡単に構築できるようにする、
	> Laravelのスキーマビルダーと一緒に使用します。


## コマンド一覧

```
migrate              Run the database migrations
migrate:install      Create the migration repository
migrate:refresh      Reset and re-run all migrations
migrate:reset        Rollback all database migrations
migrate:rollback     Rollback the last database migration
migrate:status       Show the status of each migration
```

## migrate

- Migrationを実行します
- 実行したMigrationはテーブル `migrations` に登録されます

	```
	+----------------------------------------+-------+
	| migration                              | batch |
	+----------------------------------------+-------+
	| 2016_08_08_155034_create_videos_lookup |     1 |
	| 2016_08_08_155046_create_videos        |     1 |
	| 2016_08_17_155046_modified_videos      |     1 |
	+----------------------------------------+-------+
	```
	
- テーブル `migrations` に登録されたMigrationは `migrate` コマンドで実行されません
	- このため新規作成と変更と別々のMigrationを作成する必要があります
	- テーブルのバージョン管理です

## migrate:install

- `migrations` テーブルを作成します
- ただそれだけ

## migrate:refresh

- Migrationを再実行してテーブルを再構築します
- Migrationが存在するテーブルは全て初期化されます
	- データも全て吹っ飛びます（！要注意！）
- テスト環境でテーブル定義を作りなおした時なんかに使える
- 本番で使わないこと！

## migrate:reset

- 全てのMigration操作を元に戻す
- 元に戻すっていうかテーブル全部削除する感じ？？

## migrate:rollback

- 一つ前のMigration操作を元に戻す
- `migrations` で管理されている `batch` カラムで制御している
- `migrations` テーブルが以下の状態でコマンドを打つと `2016_08_17_155811_ModifyVideos2` の操作がロールバックされる

	```
	+----------------------------------------+-------+
	| migration                              | batch |
	+----------------------------------------+-------+
	| 2016_08_08_155034_create_videos_lookup |     1 |
	| 2016_08_08_155046_create_videos        |     1 |
	| 2016_08_17_155520_ModifyVideos         |     1 |
	| 2016_08_17_155811_ModifyVideos2        |     2 |
	+----------------------------------------+-------+
	```
	
- コマンド実行後の `migrations`

	```
	+----------------------------------------+-------+
	| migration                              | batch |
	+----------------------------------------+-------+
	| 2016_08_08_155034_create_videos_lookup |     1 |
	| 2016_08_08_155046_create_videos        |     1 |
	| 2016_08_17_155520_ModifyVideos         |     1 |
	+----------------------------------------+-------+
	```
	
## migrate:status

- Migrationファイルと実行状況を見ることができる

	```
	+------+----------------------------------------+
	| Ran? | Migration                              |
	+------+----------------------------------------+
	| Y    | 2016_08_08_155034_create_videos_lookup |
	| Y    | 2016_08_08_155046_create_videos        |
	| Y    | 2016_08_17_155520_ModifyVideos         |
	| N    | 2016_08_17_155811_ModifyVideos2        |
	+------+----------------------------------------+
	```

# Migrationで運用する方法を考える

## テーブル新規作成

- LaravelのMigrationを使用する

### Migrationファイルを作成

- Laravelプロジェクトのルートへ移動
- Migrationファイル作成コマンドを打つ

	```
	php artisan make:migration [migration ファイル名]
	
	ex) php artisan make:migration CreateVideos
	```
	
- Migrationファイルは以下ディレクトリに作成される

	```
	database/migrations/[作成日時]_modified_videos.php
	ex) `database/migrations/2016_08_08_155046_create_videos.php
	```

### Migrationにテーブル定義を記述

- 作成したMigrationファイルにテーブル定義を記述していく
-  記述方法の詳しいドキュメントは以下
	- [https://readouble.com/laravel/5.1/ja/migrations.html](https://readouble.com/laravel/5.1/ja/migrations.html) 


- 作成例

	```php
	public function run()
	{
		// videos テーブルを作成する処理
       Schema::create('videos', function (Blueprint $table){
	        $table->engine = 'InnoDB';
	
	        $table->increments('id');
	        $table->string('title');
	        $table->string('description');
	        $table->timestamps();
	        $table->softDeletes();
       });
	}
	
	public function down(){}
	```

### Migrationコマンドを実行

- 作成したMigrationを実行してテーブルを新規作成する

	```
	php artisan migrate
	```
	
- これでテーブルが新規作成される
- 一度実行したMigrationはテーブル`migrations`に記録され上記コマンドで再実行されることはない	

## テーブル定義変更

- LaravelのMigrationを使用して定義を変更する
- 一度実行したMigrationファイルは`php artisan migrate`で再実行されることがないので、定義変更用のMigrationファイルを作る必要がある

### Migrationファイルを作成

- 基本的に新規作成時と同じ

	```
	php artisan make:migration [migration ファイル名]
	
	ex) php artisan make:migration ModifyVideos
	```

### Migrationに変更したい定義を記述

- 作成したMigrationファイルにテーブル定義を記述していく
-  記述方法の詳しいドキュメントは以下
	- [https://readouble.com/laravel/5.1/ja/migrations.html](https://readouble.com/laravel/5.1/ja/migrations.html) 


- 作成例

	```php
	public function run()
	{
		// videos テーブル定義を変更する
       Schema::table('videos', function (Blueprint $table){
       	
       	 // 新規カラムを追加する
	        $table->string('new_column');
	        
	        // カラムの定義を変更する
	        $table->string('original_file_name')->nullable()->change();
       });
	}
	
	public function down(){}
	```


### Migrationコマンドを実行

- 作成したMigrationを実行してテーブル定義を変更する

	```
	php artisan migrate
	```
	
- これでテーブル定義が変更される