[Laravel]migrationコマンドを理解するために実験してみた

##はじめに
プログラミング初心者ひいてはLaravel初心者なので、マイグレーションファイルを作成するときには、メモしてある入門サイトで見たコマンドをコピーして変更箇所をちょこっと編集する、みたいな面倒かつ自分的には格好悪い方法を用いていました。

ただ、「やっぱりコマンド打ちたい」「格好付けたい」と思ったので、migrationコマンドを理解するために色々実験してみました。

これをきっかけに、コマンドの勉強も少しづつしていけたらなと思っています。

##いつもコピーしているコマンド
以下の「cats」の部分（テーブル名）を変更して使い倒していました。

```ash
php artisan make:migration create_cats_table --create=cats
```

##前提
基本的な部分の理解すら危ういので、覚え書きしておきます。

- migrationコマンドは、マイグレーションファイルを作成するために打つコマンド
- マイグレーションファイルは、テーブルの作成・削除・追加をするためのファイル
- Schema::createメソッドは、新規にテーブルを作成する（以下より、createメソッド）
- Schema::tableメソッドは、既存のテーブルにカラムを追加する（以下より、tableメソッド）

テーブルの削除をするdropifExcistsメソッドもありますが、今回は横にポイしておきます。

## createプレフィックスとtableサフィックス
自分がコピーしてるコードにあるヤツですね。

create_と_tableっていう文字。

ちなみに、プレフィックスとサフィックスの意味を調べちゃいました。

そんなレベルです。

### 実験①

```bash
php artisan make:migration create_xxxx_yyyy
```
- create_のプレフィックスを付けると、自動的にそれ以降がテーブル名とみなされる
 - この場合CreateXxxxYyyyクラスが作成され、xxxx_yyyyテーブルを作成するためのファイルが作成される
 - その際、createメソッドが自動的に追加される

```php
class CreateXxxxYyyy extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('xxxx_yyyy', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('xxxx_yyyy');
    }
}
```

### 実験②

```bash
php artisan make:migration create_xxxx_yyyy_table
```
- create_xxxx_yyyy_tableのように、tableサフィックスを付けると、createとtableに挟まれた文字がテーブル名とみなされる（tableは無視される）
 - この場合CreateXxxxYyyyTableクラスが作成され、xxxx_yyyyテーブルを作成するためのファイルが作成される
 - その際、createメソッドが自動的に追加される

```php
class CreateXxxxYyyyTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('xxxx_yyyy', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('xxxx_yyyy');
    }
}
```

---

つまり、**create_以降は分かりやすければ基本何でも良い**ということだと思います。

## to
「なんじゃこれ」って感じでしたが、普段あまり使っていないだけで、チュートリアルとかに出てた気が・・・。

### 実験①
```bash
php artisan make:migration add_new_column_to_tests
```
 - この場合、testsテーブルにnew_columnというカラムを追加するためのファイルが作成される
  - その際、Shema::tableメソッドが自動的に追加される
  - なお、new_columnを追加するという処理は自分で記述しないといけない

```php
class AddNewColumnToTests extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('tests', function (Blueprint $table) {
            //
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('tests', function (Blueprint $table) {
            //
        });
    }
}
```

### 実験②
```bash
php artisan make:migration add_new_column_too_tests
```
  - toがtableメソッド作成と繋がっているぽいので、tooだとアウト（tableメソッドが追加されていないファイルが作成された）

```php
class AddNewColumnTooTests extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        //
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
    }
}
```

### 実験③
```bash
php artisan make:migration edd_new_column_to_tests
```
 - addも必要かと思っていたが、eddでもいけた

### 実験④
```bash
php artisan make:migration new_column_to_tests
```
 - 最早つけなくても大丈夫（addはファイル名をわかりやすくするためかな）

### 実験⑤
```bash
php artisan make:migration to_tests
```
 - 流石にアウト

### 実験⑥
```
php artisan make:migration new_column_to
```
 - これももちろんアウト

---

つまり、**xxx_to_yyyというように、基本的にtoとその前後に何かしら分かりやすい文字が指定されていれば問題ない**ということだと思います。

## createオプションとtableオプション
これもコピーしてたものについていたヤツですね。

### 実験①
```bash
php artisan make:migration test --create=stset
```
 - Testというクラス内にcreateメソッドを作成し、--create以降に指定された名前のテーブル（この場合はstset）を作成できるコードが記述される

```php
class Test extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create(’stset’, function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('stset');
    }
}
```

### 実験②
```bash
php artisan make:migration test --table=stset
```
 - tableメソッドを作成し、--table以降に指定された名前のテーブルにカラムを追加できるコードが記述される

```php
class Test extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('stset', function (Blueprint $table) {
            //
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('stset', function (Blueprint $table) {
            //
        });
    }
}
```

---

つまり、**createメソッド（もしくはtableメソッド）の作成とテーブル名の指定をコンパクトにでき、ファイル名ないしはクラス名と切り分けることができる**ということだと思います。

##まとめ

**create_xxx_yyyと—createオプション、xxx_to_yyyと—tableオプションを同時に指定する必要はなかった**です。

いつもコピーしているコマンドを変えるとしたら、

```bash
php artisan make:migration create_cats_table
```

もしくは（あえてcreateをファイル名・クラス名に入れたい場合は別として）

```bash
php artisan make:migration cats_table --create=cats
```

で良かったのですね。

## 蛇足
新規作成・削除と追加を同時にすることはないとは思いますが、気になったのでやってみました。

### 実験①
```bash
php artisan make:migration test --create=achira --table=kochira
```
 - createメソッドを作成し、なおかつテーブル名がkochira
 - --createに指定したachiraは無視される

```php
class Test extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('kochira', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('kochira');
    }
}
```

### 実験②
```bash
php artisan make:migration test2 --table=kochira --create=achira
```
 - createメソッドを作成し、なおかつテーブル名がkochira
 - 順番を変更しても、実験①と同じ結果

### 実験③
```bash
php artisan make:migration test2 --table --create
```
 - --create, --tableどちらも名前を指定しないと、アウト

### 実験④
```bash
php artisan make:migration test3 --table --create=tests
or 
php artisan make:migration test3 --create --table=tests
```
 - createメソッドを作成し、なおかつテーブル名はtests（--tableは無視）
 - tableメソッドを作成し、なおかつテーブル名はtests（--createは無視）

---

つまり、**createオプションとtableオプションに対して同時にテーブル名が指定された時、createはメソッド指定、tableはテーブル名指定となる**ということだと思います。

## おわりに
今後は（合っていると信じたい）上の理解を踏まえて、手打ちで実行してみます。

また、まだ若干の抵抗はありますが、コマンドの勉強もしていきたいと思います。

もし間違っている部分や補足したい部分などがありましたら、コメント頂けると嬉しいです。

ご覧いただき、ありがとうございました。