Laravelアプリ用のデータベースの作り方

この記事は、「[【連載】初めてのWindows用Laravel 5.7開発環境構築入門](https://qiita.com/hitotch/items/a646972fe1992611e92b)」の孫記事です。環境などの条件は、親記事をご覧ください。
この記事は、「[XAMPPで動くLaravelのサンプルアプリを作成する 2018年12月版](https://qiita.com/hitotch/items/2633bad4a97925511d4e)」の子記事です。

---
　Laravelアプリがデータベースなしで設計されることは、まずないでしょう。アプリ開発は、まずデータベースの作成から始めます。

作業順は以下のようになります。

- laravelexample データベース(スキーマ)の作成
- Laravelをlaravelexampleと接続
- Laravel上にテーブル定義の作成
- Laravel上に初期データの作成
- マイグレーション(Migration、テーブルとデータの適用)を実行

　ここで、テーブルや初期データをデータベースに直接作成しないのは、Laravelのアプリケーションプロジェクト内にすべてをもたせたいためです。これにより、アプリケーションのアップデートなどの際に、データベースの設計変更などもLaravelのプロジェクトの管理下に置くことができるようになります。

# laravelexample データベース(スキーマ)の作成

[以前の記事](https://qiita.com/hitotch/items/0e1751ef38f83a9f3bf4)でインストールしたHeidiSQLを立ち上げて、Localhostに接続します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/ca8b0587-fa0d-c43f-391b-ef5ed1d0dd38.png)

接続したら、Localhostを右クリックし、新規作成→データベースと進みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/12288c18-0192-a439-6926-723d6a5c5068.png)

データベースの名前は今回``laravelexample``とします。照合（文字エンコード）は``utf8mb4_unicode_ci``を選びます。これはLaravel 5.7のデフォルトエンコードです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/0655f537-51e9-cc02-4383-6ca9b73eae3c.png)

laravelexampleデータベースができたことを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/dec6ccc6-e243-9790-1b30-e2b5b093a946.png)

HeidiSQLでのデータベース作成作業はこれでOKです。

# Laravelをlaravelexampleと接続

　データベースのテーブルや初期データは、Laravel側で作成します。その前に、Laravelのプロジェクトをデータベースに接続できる状態にする必要があります。

　データベースへの接続設定は、プロジェクト内の**.env**ファイルにあります。Visual Studio Codeを開いて、**.env**を開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/ca2eaa8d-6ddf-0625-8756-73a9005dff61.png)

データベースの設定部分を以下のように書き換えます。

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravelexample
DB_USERNAME=phpuser
DB_PASSWORD=php
```

データベースのユーザー名とパスワードは、自身で設定したものにしてください。
編集が終わったら、保存します。

次に、今回はMariaDB 10.1.37を使っているため、app\Providers\AppServiceProvider.phpの冒頭とboot()関数内に、以下を記述します。これはバージョン5.7.7より古いMySQLや、バージョン10.2.2より古いMariaDBの場合に必要で、[ここ](https://readouble.com/laravel/5.7/ja/migrations.html)で指定されています。

```php
use Illuminate\Support\Facades\Schema;
```

```php
Schema::defaultStringLength(191);
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/bc9761f2-5926-def6-8dbf-838a8a81bef4.png)

編集が終わったら、保存します。

# Laravel上にテーブル定義の作成

　データベーステーブルの定義は、database\migrationsフォルダ内に設置されます。

　今回はユーザーのテーブルを定義するのですが、実はLaravelをインストールしたときに自動的に標準のユーザーテーブル定義ファイルが作られています。database\migrations\2017_10_12_000000_create_users_table.phpがそれです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/acd3a17a-349a-4181-330a-510650a45ba0.png)

　このup()関数内に、テーブルのブループリント（設計書）の内容を書くことで、後ほどこれに沿ったテーブルが作成されます。今回は特に触らずにそのまま使います。パスワードリセット用テーブル定義もありますが、気にせずそのままにしておきましょう。

# テーブル作成のmigrateを実行する

　テーブル定義をデータベースに反映するには、artisan の migrate コマンドを実行します。

　Visual Studio Codeの画面で``Ctrl + @``でターミナルを開き、以下のコマンドを実行します。

```
php artisan migrate
```

以下のようになればOKです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/27bf43e1-ec43-5757-7934-cb7acc134fe9.png)

これでテーブルが作成されたはずです。HeidiSQLでLocalhostのlaravelexampleテーブルを開いてみてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/0ac2f44c-0a61-ee56-8876-368a024a762d.png)

　usersがユーザーテーブルです。

　他にパスワードリセット用テーブルがありますが今回は使いませんが、放置しておきましょう。migrationsテーブルは、migrationコマンドの動作制御のためのものなので放置しておきます。

# Laravel上に初期データ(Seeder)の作成

　テーブルは作成できましたが、初期管理ユーザーがないと困ることでしょう。こういった初期データや、テスト用データもLaravel上で定義します。この定義を、**Seeder**（シーダー、種まき屋）と呼びます。

　まず、デフォルト状態では初期データ適用に使うFakerという機能が本番環境でオフになっているので、これをオンにします。

　composer.jsonをあけて、``"fzaninotto/faker": "^1.4"`` の記述を ``require-dev`` から ``require`` に移動します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/4e2ffa6c-bc9e-74c1-8cae-52ac39bd87af.png)

こうなります。カンマに気をつけてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/6d961e7c-54c5-763c-41d4-b6b084966ce0.png)

では、Seederを作りましょう。``Ctrl + @`` でターミナルを開き、以下を実行します。

```
php artisan make:seeder UsersTableSeeder
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/8b72850d-96a7-7b3c-126f-9fe8b2118246.png)

作ったSeederは、database\seedsに格納されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/997f25e6-3dc9-39dc-05a2-f4c30d18b894.png)

run()関数内に、初期データを入れます。

```php:UsersTableSeeder.php
    public function run()
    {
        //
        // Start using Faker
        $faker = Faker\Factory::create('ja_JP');

        // Create admin user
        DB::table('users')->insert([
            'name' => 'admin',
            'email' => 'admin@example.com',
            'password' => bcrypt('1234'),
            'email_verified_at' => $faker->dateTime(),
            'created_at' => $faker->dateTime(),
            'updated_at' => $faker->dateTime(),
        ]);
    }
```

ここで、適当に日付を作るためにFakerが使われています。

編集したら保存します。

作ったSeederは、database\seeds\DatabaseSeeder.php に登録して、存在をLaravelに教えます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/19114f57-7bab-fe7e-74b9-b99df0102fee.png)

DatabaseSeeder.php にはすでにユーザーテーブルの記述がありますが、コメントアウトされています。``//`` を消して、有効にしましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/aabc046d-e38e-b4af-b616-b1d41c459eb9.png)

保存を忘れずに。これでSeederの準備は完了です。

# マイグレーション(Migration、テーブルとデータの適用)を実行

では、もう一度Migrationを実行しましょう。今度はSeederも使います。
```Ctrl + @```でターミナルを開いて、以下を実行します。

```
php artisan migrate --seed
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/76035b19-1434-86d9-6042-3d2e2ed71ff9.png)

Nothing to migrate. とは、テーブルは特に変更なし、何もしない。という意味です。さっきテーブルを作ったので、これで正解です。

Seeding: UserTableSeeder とは、UserTableSeederでデータを作成しているという意味です。

Database seeding completed successfully. とは、Seedingが成功した、という意味です。

では、データベースを確認してみましょう。

HeidiSQLを開けて、Localhostのlaravelexampleを見てみます。
usersテーブルのデータタブを開くと、データが入っていることがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/2e298bd1-791c-e90a-0b69-e666d5523927.png)

データベースの作成はこれでOKです。