Laradoc×Dockerでマイグレーション

# 前提条件
- mac Big Sir(intel core)
- LaraDockで環境構築済

※　今回はマイグレーションの話なので、基本的な操作や概念は変わりませんが、マイグレーションのコマンドがDockerのワークスペースに入って行うので、多少異なっています。

参考：[Laravel8.x マイグレーション](https://readouble.com/laravel/8.x/ja/migrations.html)

# テーブルとマイグレーションファイルを作るコマンド

※ 必ず、Docker Desktopを立ち上げて、laradocディレクトリで
`$ docker-compose up -d workspace php-fpm nginx mysql phpmyadmin`
のように起動させた状態で行う。

`$ docker-compose exec workspace`＋コマンド
で、Dockerのワークスペースに入らなくてもコマンドを実行できる。

そのため、マイグレーションコマンドは以下のようになる。
必ずlaradocのディレクトリに移動してから以下のコマンドを実行する。

```
laradoc$ docker-compose exec workspace php artisan make:model テーブル名 --migration
```

末尾にオプション`--migration`をつけると、テーブルを作ると同時に、マイグレーションファイルを作ってくれるので、そのマイグレーションファイルを開いて、どんなカラムが欲しいか書いていくときに使える。

# マイグレーションファイルの所在
マイグレーションファイルはアプリケーションフォルダに存在するので、laradocフォルダの中ではなく、兄弟フォルダのアプリケーションフォルダの中にあるdatabase/migration/の中に作られていく。

テーブルができたら、ここを開いてカラムの指定を書いていこう。

# マイグレーションファイルのファイル名の読み方

ファイル名は以下のように、`日付と通し番号の後にcreate+テーブル名.php`になってる。

```
2014_10_12_100000_create_password_resets_table.php
```


## `public function up()`の読み方
テーブルを作るときに、なんて名前のテーブルで、どんなカラムを作るのか？という指示をここに書き込む。

サンプル
```
public function up()
    {
        Schema::create('password_resets', function (Blueprint $table) {
            $table->string('email')->index();
            $table->string('token');
            $table->timestamp('created_at')->nullable();
        });
    }
```

これを元に説明します。
### Schemaクラス
MySQLでもPostgreSQLでも、どんなデータベースでも操作できる魔法のクラス集

### Schema::create()
テーブルを作るために使えるようにSchemaクラスが持ってるメソッド。
テーブル使いたい時にはこれ使う。

```
Schema::create('テーブル名', function (Blueprint $table) {ここに欲しいカラムについて書く}
```

第一引数にテーブル名、第二引数にどんなカラムが欲しいのか渡す関数を設定。
第二引数の関数に渡されてる引数でBlueprintはスキーマビルダとかいう新しいテーブルを定義するためのオブジェクト。$tableはテーブルオブジェクト。両方いつも使う決まり文句なので深く考えないで使いまわそう。

### カラムの定義のやり方
基本は以下のような構成で書く

```
$table->カラムの型('カラムの名前')->カラム修飾子();
```

#### $table->bigIncrements('id');
idみたいな勝手に管理番号を割り振っておいてほしい物には`$table->bigIncrements()`こんな感じで書く。

#### $table->timestamps();
テーブルに作成日時と、更新日時を追加したいときは、これ書くと勝手にcreated_atカラムとupdated_atカラム作ってくれる。2個書かなくていい。便利。
`$table->timestamp('created_at')->nullable();`と、作成日時が欲しい時は引数に渡してあげるとこんな感じで書く。

`->nullable()`は[Column Modifiers(カラム修飾子)](https://laravel.com/docs/8.x/migrations#column-modifiers)とかいうもので、ここにはnullが入ってもいいよ指定。

### [Column Modifiers](https://laravel.com/docs/8.x/migrations#column-modifiers)
カラムの名前と[カラムの型](https://laravel.com/docs/8.x/migrations#available-column-types)を指定するだけじゃなくて、

## `public function down()`の読み方
ここに書くと、そのテーブルを消したいときに何をやって欲しいか？を指示できる。

サンプル
```
public function down()
    {
        Schema::dropIfExists('password_resets');
    }
```

## Schema::dropIfExists
`Schema::dropIfExists('テーブル名');`で、消したいテーブル名を引数に入れると、消してくれるメソッド。
消すだけなのでここは記述量が少ない。簡単。


# マイグレーションファイルを変更したらマイグレーションの実行

```
laradoc$ docker-compose exec workspace php artisan migrate
```

Migration table created successfully.て出たら成功。

# データを入れてどんな表示になるか見たい…そうだSeederだ！
テーブルにSQLをぽちぽち打ってデータを挿入しなくても、Seederを使えば連想配列でデータを入れてくれて、ちょっとだけ楽できてチームで共有もできる…そんな便利機能がSeederです。

## Seederファイルを作って連想配列を書く
以下のコマンドでテーブルごとに挿入したいデータを記述するSeederファイルを作ります

```
laradoc$ docker-compose exec workspace php artisan make:seeder ファイル名
```

Seeder created successfully.と出たら成功。

アプリケーションフォルダ/database/seedsにファイル名.phpというファイルが生成されます。
開くと、以下のような記述がありまます。

```
    public function run()
    {
        // ここに入れたいデータの連想配列を書いていく
    }
```

連想配列で登録したいデータを書いていきます。

```
public function run()
    {
        DB::table('テーブル名')->insert([
          [
            'カラム名1' => データ1,
            'カラム名2' => データ2,
          ],
          [
            'カラム名1' => データ3,
            'カラム名2' => データ4,
          ],
        ]);
    }
```

## さっきのファイルが実行されるようにDatabaseSeeder.phpを変更
アプリケーションフォルダ/database/seeds/DatabaseSeeder.phpを開く。
すると以下のような記述があるのでここをカスタマイズする。

```
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
    }
```

さっき連想配列を書いたファイル名は、その中でファイル名と同じクラスが作られていて、そのクラスの中に連想配列を書いた。

なので、ファイル名＝クラス名なので、ここではもともと入っていてコメントアウトされてる
`// $this->call(UsersTableSeeder::class);`
を利用して、ファイル名を書き込んであげるだけでOK！

```
    public function run()
    {
        $this->call(ファイル名::class);
    }
```

## Seeder実行
laradocディレクトリにいることを確認してから、

```
laradoc$ docker-compose exec workspace php artisan db:seed
```
Database seeding completed successfully.と出れば成功！