Laravelでテーブル作成

# 目次
Laravelの記事一覧は下記
[PHPフレームワークLaravelの使い方](https://qiita.com/toontoon/items/c4d0371e504c37f6576e)

# Laravelバージョン
動作確認はLaravel Framework 7.19.1で行っています

# 前提条件
[eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)](https://qiita.com/toontoon/items/76fa7f8845b20776077c)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています

[Laravelでデータベースを扱う準備をする](https://qiita.com/toontoon/items/740b9575d2a323e93c0d)
本記事は上記が完了している前提で書かれています
上記記事で作成したデータベースを使っていきます

# マイグレーション生成
コマンドラインで
`sample`
`php artisan make:migration table1`
`php artisan make:migration table2`
`php artisan make:migration table3`
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押します
eclipseプロジェクトを右クリック→リフレッシュ
/sample/database/migrations/xxxx_xx_xx_xxxxxx_table1.phpが現れます
/sample/database/migrations/xxxx_xx_xx_xxxxxx_table2.phpが現れます
/sample/database/migrations/xxxx_xx_xx_xxxxxx_table3.phpが現れます
作成されたファイルの接頭辞がタイムスタンプになっているのは、マイグレーションの実行順をフレームワークに知らせるためです

# マイグレーション修正
(1) /sample/database/migrations/xxxx_xx_xx_xxxxxx_table1.phpを下記に修正

```xxxx_xx_xx_xxxxxx_table1.php
<?php

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

class Table1 extends Migration
{
    public function up()
    {
        Schema::create('table1', function (Blueprint $table) {
            $table->id()->autoIncrement();
            $table->string('varchar_col', 255)->nullable()->default(null);
            $table->integer('int_col')->nullable()->default(null);
            $table->dateTime('datetime_col')->nullable()->default(null);
            $table->date('date_col')->nullable()->default(null);
            $table->time('time_col')->nullable()->default(null);
            $table->engine = 'InnoDB';
            $table->charset = 'utf8mb4';
            $table->collation = 'utf8mb4_bin';
        });
    }

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

```

(2) /sample/database/migrations/xxxx_xx_xx_xxxxxx_table2.phpを下記に修正

```xxxx_xx_xx_xxxxxx_table2.php
<?php

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

class Table2 extends Migration
{
    public function up()
    {
        Schema::create('table2', function (Blueprint $table) {
            $table->id()->autoIncrement();
            $table->unsignedBigInteger('table1_id')->nullable()->default(null);
            $table->string('varchar_col', 255)->nullable()->default(null);
            $table->integer('int_col')->nullable()->default(null);
            $table->dateTime('datetime_col')->nullable()->default(null);
            $table->date('date_col')->nullable()->default(null);
            $table->time('time_col')->nullable()->default(null);
            $table->engine = 'InnoDB';
            $table->charset = 'utf8mb4';
            $table->collation = 'utf8mb4_bin';
        });
    }

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

```

(3) /sample/database/migrations/xxxx_xx_xx_xxxxxx_table3.phpを下記に修正

```xxxx_xx_xx_xxxxxx_table3.php
<?php

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

class Table3 extends Migration
{
    public function up()
    {
        Schema::create('table3', function (Blueprint $table) {
            $table->id()->autoIncrement();
            $table->unsignedBigInteger('table2_id')->nullable()->default(null);
            $table->string('varchar_col', 255)->nullable()->default(null);
            $table->integer('int_col')->nullable()->default(null);
            $table->dateTime('datetime_col')->nullable()->default(null);
            $table->date('date_col')->nullable()->default(null);
            $table->time('time_col')->nullable()->default(null);
            $table->dateTime('create_datetime')->nullable()->default(null);
            $table->dateTime('update_datetime')->nullable()->default(null);
            $table->engine = 'InnoDB';
            $table->charset = 'utf8mb4';
            $table->collation = 'utf8mb4_bin';
        });
    }

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

```

upメソッドに書かれたのはマイグレーションを実行するときのコードです。テーブルを作成しています
downメソッドに書かれたのはマイグレーションをロールバックするときコードです。テーブルを削除しています
Schema::createでcreate tableになります
Schema::createの第二引数に与えているクロージャでカラムを作成しています
`$table->integer`はinteger型のカラムを作成し、`$table->string`はvarchar型のカラムを作成します
作成できるカラムは下記で確認できます
[Laravel 7.x データベース：マイグレーション カラム](https://readouble.com/laravel/7.x/ja/migrations.html#columns)

nullable()はカラムにnullを許容させています
default()はカラムのデフォルト値を設定します
他にもいろいろカラムに設定できます。下記で確認できます
[Laravel 7.x データベース：マイグレーション カラム修飾子](https://readouble.com/laravel/7.x/ja/migrations.html#column-modifiers)

# マイグレーション実行
コマンドラインで
`php artisan migrate`
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押します

/sample/database/migrationsに格納されているマイグレーションクラスのupメソッドが実行されていきます
/sample/database/migrationsにはもともとusersとfailed_jobsが入っていると思います
そこに今回作成したファイル3つの合計5ファイルが実行されたはずです

# 確認
MySQLでlaravel_sampleデータベースを確認してみましょう

```
show tables;
+--------------------------+
| Tables_in_laravel_sample |
+--------------------------+
| failed_jobs              |
| migrations               |
| table1                   |
| table2                   |
| table3                   |
| users                    |
+--------------------------+
6 rows in set (0.001 sec)
```

テーブルが作成されたことを確認できました