Laravelでテーブルと初期値を作成する

#はじめに
Laravelのマイグレーションファイルとシーダーファイルを使って、テーブルとその初期値を作成します。

#準備
###データベースの作成
まず、データベースを作成します。
プロジェクトで使用する「データベース」「ユーザー」「パスワード」を作成しておきます。
各自の環境によるので、割愛します。

###データベース接続の設定
Laravelプロジェクト直下にある「.env」ファイルを以下のように修正します。

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE="データベース名"
DB_USERNAME="ユーザー名"
DB_PASSWORD="ユーザーパスワード"
```
mysql以外を使用する場合は、DB_CONNECTION等も修正します。
準備は完了です。

#テーブルの作成
###マイグレーションファイルの作成
Larabelプロジェクトの直下に移動後、コンソールで以下のコマンドを実行します。
今回はテーブル名を"items"とします。

```
php artisan make:migration create_items_table
```
以下の表示が出れば成功です。

```
Created Migration: yyyy_MM_dd_HHmmss_create_items_table
```
（yyyy_MM_dd_HHmmssは作成時の日時が入ります。）

###マイグレーションファイルの修正
作成したマイグレーションファイルは、Laravelプロジェクト＞database＞migrations下に作られています。
初期状態で以下の内容が書かれています。
upはマイグレーションを実行する際に実行され、downはマイグレーションを元に戻す際に実行されます。

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

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('items');
    }
}
```
upの中に列の定義を記述します。
`$table->"型名"("列名")`の形です。

```
            $table->bigIncrements('id');
            $table->string('name'); // 追加
            $table->timestamps();
```

###マイグレーションの実行
Larabelプロジェクトの直下に移動後、コンソールで以下のコマンドを実行します。

```
php artisan migrate
```
以下の表示が出れば成功です。

```
Migrating: yyyy_MM_dd_HHmmss_create_items_table
Migrated:  yyyy_MM_dd_HHmmss_create_items_table
```

環境によっては、「SQLSTATE[42000]: Syntax error or access violation」が出ます。
いくつか方法があるようですが、私は以下の対策をしました。

Laravelプロジェクト＞app＞Providers＞AppServiceProvider.phpファイルのboot()内に、以下の記述を追加します。

```
    public function boot()
    {
        Schema::defaultStringLength(191);
    }
```

#モデルの作成
Larabelプロジェクトの直下に移動後、コンソールで以下のコマンドを実行します。

```
php artisan make:model Item
```
以下の表示が出れば成功です。

```
Model created successfully.
```

#初期値の作成
###シーダーファイルの作成
Larabelプロジェクトの直下に移動後、コンソールで以下のコマンドを実行します。

```
php artisan make:seeder ItemsTableSeeder
```
以下の表示が出れば成功です。

```
Seeder created successfully.
```

###シーダーファイルの修正
作成したマイグレーションファイルは、Laravelプロジェクト＞database＞seeds下に作られています。
初期状態で以下の内容が書かれています。

```
class ItemsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}
```
runの中に初期値の作成を記述します。
流れは、
「先ほど作成したモデルをnewする→値を設定→save()で登録」
です。
複数件作りたい場合は、for文などで記述します。

```
        for($i = 1; $i <= 5; $i++)
        {
            $item = new Item();
            $item->name = '名前' . $i;
            $item->save();
        }
```

###シーダーの実行
Larabelプロジェクトの直下に移動後、コンソールで以下のコマンドを実行します。

```
php artisan db:seed --class=ItemsTableSeeder
```
以下の表示が出れば成功です。

```
Database seeding completed successfully.
```

確認すると、きちんと追加されていました。

```
+----+-------+---------------------+---------------------+
| id | name  | created_at          | updated_at          |
+----+-------+---------------------+---------------------+
|  1 | 名前1 | 2019-04-11 21:13:35 | 2019-04-11 21:13:35 |
|  2 | 名前2 | 2019-04-11 21:13:35 | 2019-04-11 21:13:35 |
|  3 | 名前3 | 2019-04-11 21:13:35 | 2019-04-11 21:13:35 |
|  4 | 名前4 | 2019-04-11 21:13:35 | 2019-04-11 21:13:35 |
|  5 | 名前5 | 2019-04-11 21:13:35 | 2019-04-11 21:13:35 |
+----+-------+---------------------+---------------------+
5 rows in set (0.00 sec)
```

#コマンドまとめ
マイグレーションファイル作成
※テーブル名は「小文字始まり、複数形」

```
php artisan make:migration create_"テーブル名"_table
```
マイグレーション実行

```
php artisan migrate
```
モデル作成
※モデル名は「大文字始まり、単数形」

```
php artisan make:model "モデル名"
```
シーダーファイル作成

```
php artisan make:seeder "モデル名の複数形"TableSeeder
```
シーダーの実行

```
php artisan db:seed --class="シーダー名"
```