LravelのDBテーブル作成&データ投入

##お約束事
本記事で発信される情報は、正確性、完全性、有用性、その他の事項について一切責任を負いかねます。自己判断にてご活用ください。

#全体の流れ

- Migrationを行いテーブルを作成する
 1. migrationコマンドを実行するための空ファイルの作成
 2. 作成されたmigrationファイルをテーブル構造通りに記述する
 3. migrateコマンドで実際にテーブルを作成する
 4. 型変更、カラム追加・削除等

- Sheederを用いてテーブルデータを投入する
 1. seedを実行するための空ファイルの作成
 2. 作成されたseedファイルを投入したいデータに合わせて記述する
 3. seedコマンドで実際にテーブルにデータを投入する

##Migrationでテーブルを作成する

###1、migrationするための空ファイルの作成

```:ターミナルでの作業
$php artisan make:migration {テーブル名}
Created Migration: {年}_{月}_{日}_{時間}_{テーブル名}
```
{プロジェクトRoot}/database/migrationsにファイルが作成される。

### 2、作成されたmigrationファイルをテーブル構造通りに記述する
```php:作成されたmigrationファイル
<?php

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

class AppSystem extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        //{}は不要
        Schema::create('{テーブル名}', function (Blueprint $table) {
            $table->bigIncrements('id');//インクリメントするbigInt
            $table->boolean('is_maintenance');//bool型
            $table->text('app_version');//text
            $table->dateTime("created_at");//dateTime
            $table->dateTime("updated_at");//dateTime
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //{}は不要
        Schema::dropIfExists('{テーブル名}');
    }
}
```

### 3、migrateコマンドで実際にテーブルを作成する
```:ターミナルでの作業
$php artisan migrate
Migrating: 2020_03_21_115544_app_system
Migrated:  2020_03_21_115544_app_system (0.05 seconds)
`````
※Dockerの場合は、workspaceにログインして実行しないとErrorになります。

作業後にDBにテーブルが作成されていること、migrationsテーブルに実行履歴が登録されていることが確認できる。
### 4、型変更、カラム追加・削除等
####型変更
```:ターミナルでの作業
php artisan make:migration change_{対象カラム名}_{テーブル名}_table --table={テーブル名}
Created Migration: 2020_03_21_141300_xxxxxxxxxxxxxxx
```
※何をしたかわかりやすい名前がよいと思います。

```php:migrateファイルを修正
   public function up()
    {
        Schema::table('{テーブル名}', function (Blueprint $table) {
            //新しい型
            $table->text('{カラム名}')->change();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('{テーブル名}', function (Blueprint $table) {
            //変更前の型
            $table->string('{カラム名}')->change();
        });
    }
```

####カラム追加、削除
```:ターミナルでの作業
php artisan make:migration add_{対象カラム名}_{テーブル名}_table --table={テーブル名}
Created Migration: 2020_03_21_141300_xxxxxxxxxxxxxxx
```
※何をしたかわかりやすい名前がよいと思います。

```php:migrateファイルを修正（削除はupとdown内の動作を入れ替えればOK）
   public function up()
    {
        Schema::table('{テーブル名}', function (Blueprint $table) {
            //カラム追加 afterで指定したカラムの後ろに追加できる
            $table->string('{カラム名}')->after('id');
        });    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
       Schema::table('{テーブル名}', function (Blueprint $table) {
            //カラム削除
            $table->dropColumn('{カラム名}');
        });
    }
```

##Seederでのデータ投入

###1、seedを実行するための空ファイルの作成

```:ターミナルでの作業
$php artisan make:seeder {ファイル名}
Seeder created successfully.
```
{プロジェクトRoot}/database/seedsにファイルが作成される

```:ターミナルでの作業
$php composer dump-autoload
Discovered Package: beyondcode/laravel-dump-server
Discovered Package: encore/laravel-admin
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
```

###2、 作成されたseedファイルを投入したいデータに合わせて記述する
```php:作成されたseederファイルを修正
<?php

use Illuminate\Database\Seeder;
use App\Libs\Common;
class LevelSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //Jsonファイルを読み込みdecodeしてくれる自作クラスを呼び出す。
        //SpreadSheetで作成したマスターデータをJson化したデータが配置してある。
        $dataArray = Common::getJsonFile('{jsonFile名}');

        //Jsonデータを1件ずつ挿入
        foreach ($dataArray as $value){
            $insertData = array();
            foreach ($value as $key => $data) {
                $insertData[$key] = $data;
            }
            DB::table('level')->insert([
                $insertData
            ]);
        }
    }
}

```

```php:Jsonファイルを読み込みdecodeするクラス
<?php
namespace app\Libs;
class Common
{
    public static function getJsonFile($fileName){
        $url = public_path() . '/json/'.$fileName.'.json';
        $json = file_get_contents($url);
        $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
        $arr = json_decode($json, true);
        return $arr;
    }
}

```
※ファイルの存在チェックとかはしておりません。必要であればしてください。
※本番環境にjsonファイルはアップしないので、このまま本番にアップするとマスターデータ丸見え等
　セキュリティ的に良くないので.gitignore等で除外してください。

###3、seedコマンドで実際にテーブルにデータを投入する

```:ターミナルでの作業（任意のテーブルに実行）
$php artisan db:seed --class={1で作成したクラスを指定}
Database seeding completed successfully.
```
※数百件レベルのデータなら秒で終わるので負荷とかは検討していません。