Laravel5.7: DBとしてMySQLを用意する

ローカル開発環境で使うDBを用意します。
Laravel5.4ではSQLiteを使っていましたが、5.5からはMySQLを使うことにします。
SQLiteについては下記を御覧ください。
:link: [Laravel5.4: DBとしてSQLiteを用意する - Qiita](https://qiita.com/sutara79/items/f71bb5b93c91cd2c0852)

# 親記事
[Laravel 5.7で基本的なCRUDを作る - Qiita](http://qiita.com/sutara79/items/ef30fcdfb7afcb2188ea)


# MySQLのデータベースを作る
XAMPPにはphpMyAdminが付属しているので、それを使います。

- データベース名: `laravel57`
- 照合順序(Collation): `utf8mb4_unicode_ci`

コマンドラインでは下記のように。

```:PowerShell
# ユーザー名「root」、パスワードなしで接続
> mysql --user=root --password=

# 長いので改行しています。
MariaDB [(none)]> CREATE DATABASE `laravel57`
       CHARACTER SET utf8mb4
       COLLATE utf8mb4_unicode_ci;
```

照合順序はLaravelのデフォルトのMySQLの設定に合わせました。
:link: [MySQLの文字コードとCollation - Qiita](https://qiita.com/tfunato/items/e48ad0a37b8244a788f6)


# DB設定を環境設定ファイルに記述する
`.env`のDB接続の部分を、先ほど作成したDBに合わせます。

```text:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel57
DB_USERNAME=root
DB_PASSWORD=
```

# varchar型の文字数を191に制限する
MySQL5.7.7、またはMariaDB10.2.2より古い場合に必要です。
詳しくは下記を御覧ください。
:link: readouble.com: [インデックス長とMySQL／MariaDB](https://readouble.com/laravel/5.7/ja/migrations.html#creating-indexes)

```diff:app/Providers/AppServiceProvider.php
+ use Illuminate\Support\Facades\Schema;
 
(中略)

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

# マイグレーションの準備をする
:link: readouble.com: [マイグレーション](https://readouble.com/laravel/5.7/ja/migrations.html)

## users用のマイグレーション
マイグレーションのファイルは既存のものを流用します。
言語(日本語/英語)のカラムを追加します。

```diff:database/migrations/2014_10_12_000000_create_users_table.php
      public function up()
      {
          Schema::create('users', function (Blueprint $table) {
              $table->increments('id');
              $table->string('name');
              $table->string('email')->unique();
              $table->timestamp('email_verified_at')->nullable();
              $table->string('password');
+             $table->string('lang')->default('en');
              $table->rememberToken();
              $table->timestamps();
          });
      }
```

## posts用のマイグレーション
Artisanコマンドでマイグレーションを生成します。

```text:PowerShell
> php artisan make:migration create_posts_table
```

生成したファイル内の`up()`メソッドを下記のようにします。

```php:database/migrations/2017_05_22_041557_create_posts_table.php
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }
```

# テーブルの中身を用意する
:link: readouble.com: [シーディング](https://readouble.com/laravel/5.7/ja/seeding.html)

## Fakerをインストール
仮のデータを自動生成してくれる[Faker](https://github.com/fzaninotto/Faker)を利用します。
すでに`require-dev`として`composer.json`に記述されていますが、今回は本番のHerokuでも使いたいので`require`へ移します。

```diff:composer.json
      "require": {
+         "fzaninotto/faker": "^1.4",
      },
      "require-dev": {
-         "fzaninotto/faker": "^1.4",
      },
```

書き換えたら、`composer update`を実行します。

## users用シーダー
```text:PowerShell
# シーダーを生成
> php artisan make:seeder UsersTableSeeder
```

生成したファイル内の`run()`メソッドを下記のリンク先のようにします。
:page_facing_up: [database/seeds/UsersTableSeeder.php](https://github.com/sutara79/demo-laravel-crud/blob/5.7/database/seeds/UsersTableSeeder.php)

## posts用シーダー
```txt:PowerShell
> php artisan make:seeder PostsTableSeeder
```

```php:database/seed/PostsTableSeeder.php
    public function run()
    {
        // Fakerを使う
        $faker = Faker\Factory::create('ja_JP');

        // ランダムに記事を作成
        for ($i = 0; $i < 40; $i++)
        {
            DB::table('posts')->insert([
                'title' => $faker->text(20),
                'body' => $faker->text(200),
                'created_at' => $faker->dateTime(),
                'updated_at' => $faker->dateTime(),
            ]);
        }
    }
```

## シーダーの呼び出しを設定する
`run()`メソッドを下記のようにします。

```php:database/seeds/DatabaseSeeder.php
    public function run()
    {
        $this->call([
            UsersTableSeeder::class,
            PostsTableSeeder::class,
        ]);
    }
```


# マイグレーションとシーディングを実行する
下記を実行して、テーブルとレコードが生成されていることをphpMyAdminで確認してください。

```text:PowerShell
# マイグレーションとシーディングを同時に行う
> php artisan migrate --seed

# 上の操作をやり直したい場合
> php artisan migrate:refresh --seed
```

:link: readouble.com: [ロールバック](https://readouble.com/laravel/5.7/ja/migrations.html#rolling-back-migrations)