Laravel Migration 基礎

# はじめに
- Laravel Migration の基礎的な使い方のメモ

## 環境
### Laravel
```console
$ php artisan --version
Laravel Framework 5.8.16
```
### Mysql
```
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.28    |
+-----------+
1 row in set (0.00 sec)
```

# テーブルを追加して、Laravelで使う
### ① Table の作成
- コマンドを実行し、 Created Migartion が返答で帰ってくれば、作成できている。

```console
$ php artisan make:migration create_tests_table
> Created Migration: yyyy_MM_dd_HHmms_create_tests_table
```

- 作成したファイルは、`プロジェクト/database/migrations/` の直下に作成したファイルができている。
- 上記のサンプルだと、『yyyy_MM_dd_HHmms_create_tests_table.php』というファイルができている。

### ② Migration ファイルの編集

- ファイルができているので、追加したいカラムなどを設定していく
- varchar(128)の name カラムを追加
- unsigned int の number を追加 

```yyyy_MM_ddHHmmss_create_tests_table.php
class CreateTestsTable extends Migration
{
    public function up()
    {
        Schema::create('tests', function (Blueprint $table) {
            $table->bigIncrements('id');

            $table->string('name', 128)->nullable()
                ->comment('名前');          // varchar 文字長 128 
            $table->integer('number')->nedned()
                ->comment('番号');          // int 符号なし

            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('tests');
    }
}

```

### ③ Migration ファイルの実行
- 実行すると、データベースに作成したテーブルができる

```console
$ php artisan migrate
> Migrating: YYYY_MM_DD_ddHHmmss_tests_table
> Migrated:  YYYY_MM_DD_ddHHmmss_tests_table
```

- テーブルができているか、Mysql 側で確認してみる

```sql
mysql> DESCRIBE tests;
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| name       | varchar(128)        | YES  |     | NULL    |                |
| number     | int(10) unsigned    | NO   |     | NULL    |                |
| created_at | timestamp           | YES  |     | NULL    |                |
| updated_at | timestamp           | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
```

### ④ Model を作成し、Laravelで使う
- コマンドラインから Model の作成を行う
- DB のテーブルを作成するときは複数形だったけど、クラスは単数に変更して作成する

```
$ php artisan make:model Models/Test
>Model created successfully.
```
- 正常に実行できると `プロジェクト/app/Models/` の下に `Test.php` が作成される

## ロールバック
### 実行した migration ファイルをロールバックできる

- 現状の migrations の実行状態に対して、`batch` 1まで戻りたい。

```sql
mysql> select * from migrations;
+----+-----------------------------------------------------+-------+
| id | migration                                           | batch |
+----+-----------------------------------------------------+-------+
| 1  | YYYY_MM_DD_HHIISS_create_test_logs                  |     1 |
| 2  | YYYY_MM_DD_HHIISS_create_sync_logs                  |     1 |
| 3  | YYYY_MM_DD_HHIISS_create_tests_table                |     2 |
| 4  | YYYY_MM_DD_HHIISS_add_column_check_type             |     3 |
+----+-----------------------------------------------------+-------+
```

- 1 まで戻るには、２つ戻る必要がある。
- なので `migration:rollback` コマンドの後ろに 引数を付けて２つ戻る
- 引数なしで実行すると、一つ前のみしか戻らない

```
$ php artisan migrate:rollback --step=2
> Rolling back: YYYY_MM_DD_HHIISS_add_column_check_type
> Rolled back:  YYYY_MM_DD_HHIISS_add_column_check_type
> Rolling back: YYYY_MM_DD_HHIISS_create_tests_table
> Rolled back:  YYYY_MM_DD_HHIISS_create_tests_table
```

- 正常に戻ったか確認する

```
mysql> select * from migrations;
+----+-----------------------------------------------------+-------+
| id | migration                                           | batch |
+----+-----------------------------------------------------+-------+
| 1  | YYYY_MM_DD_HHIISS_create_test_logs　　　　　　        |     1 |
| 2  | YYYY_MM_DD_HHIISS_create_sync_logs                  |     1 |
+----+-----------------------------------------------------+-------+
```

- 本当に消えたか念のため、テーブルある確認。なければおっけ〜

```
mysql> DESCRIBE tests;
ERROR 1146 (42S02): Table 'tests' doesn't exist
```