PHP
アジャイル
laravel

イテレーション1のテーブルをマイグレーションで生成し、シーダーでデータを挿入!~アジャイルでDevOpsなシステム構築実践~

イテレーション1について

実際の開発を記事にしています。
イテレーション1についてはリンク先を参照してください。

イテレーション1のE-R図

次のE-R図に基づいて、マイグレーションとシーダーを作成します。

E-R図 イテレーション1.png

マイグレーションとシーダーの作成方法

マイグレーションとシーダーの作成方法は下記のページで解説をしています。
開発における悩ましいデータベース共有問題を解決するLaravelのマイグレーションとシーダー解説編~アジャイルでDevOpsなシステム構築実践~

今回作成したマイグレーションとシーダー

試験区分/Examinations

Examinationsのマイグレーション

マイグレーション:2017_12_12_224229_create_examinations_table.php
<?php

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

class CreateExaminationsTable extends Migration
{
    /**
     * マイグレーション実行
     *
     * @return void
     */
    public function up()
    {
        Schema::create('examinations', function (Blueprint $table) {
            $table
                ->increments('id')
                ->comment('ID');

            $table
                ->string('name')
                ->comment('試験区分名');

            $table
                ->timestamp('created_at')
                ->default(DB::raw('CURRENT_TIMESTAMP'))
                ->comment('登録日');

            $table
                ->timestamp('updated_at')
                ->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'))
                ->comment('更新日');
        });
    }

    /**
     * ロールバック時
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('examinations');
    }
}

examinationsテーブルが生成されました。

examinations.PNG

Examinationsのシーダー

シーダー:ExaminationsTableSeeder.php
<?php

use Illuminate\Database\Seeder;

/*
 * Eloquentを利用するのでExaminationモデルを使う
 */
use App\Examination;

class ExaminationsTableSeeder extends Seeder
{
    /**
     * シーダーを実行
     *
     * @return void
     */
    public function run()
    {
        /*
         * 必要な情報を配列化
         */
        $examination_names[] = 'ITパスポート試験';
        $examination_names[] = '基本情報技術者試験';
        $examination_names[] = '応用情報技術者試験';
        $examination_names[] = '情報セキュリティマネジメント試験';

        /*
         * ループしてデータを作成
         */
        foreach($examination_names as $examination_name)
        {
            Examination::create([
                'name' => $examination_name
            ]);
        }
    }
}

examinationsデータが生成されました。

examinations_data.PNG

試験実施回/rounds

roundsのマイグレーション

2017_12_12_231913_create_rounds_table.php
<?php

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

class CreateRoundsTable extends Migration
{
    /**
     * マイグレーション実行
     *
     * @return void
     */
    public function up()
    {
        Schema::create('rounds', function (Blueprint $table) {
            $table
                ->increments('id')
                ->comment('ID');

            $table
                ->string('name')
                ->comment('試験実施回名');

            $table
                ->timestamp('created_at')
                ->default(DB::raw('CURRENT_TIMESTAMP'))
                ->comment('登録日');

            $table
                ->timestamp('updated_at')
                ->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'))
                ->comment('更新日');
        });
    }

    /**
     * ロールバック時に実行
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('rounds');
    }
}

roundsテーブルが生成されました。

rounds.PNG

roundsのシーダー

RoundsTableSeeder.php
<?php

use Illuminate\Database\Seeder;

/*
 * Eloquentを利用するのでRoundモデルを使う
 */
use App\Round;

class RoundsTableSeeder extends Seeder
{
    /**
     * シーダーを実行
     *
     * @return void
     */
    public function run()
    {
        /*
         * 必要な情報を配列化
         */
        $round_names[] = '平成21年度春';
        $round_names[] = '平成21年度秋';
        $round_names[] = '平成22年度春';
        $round_names[] = '平成22年度秋';
        $round_names[] = '平成23年度特別';
        $round_names[] = '平成23年度秋';
        $round_names[] = '平成24年度春';
        $round_names[] = '平成24年度秋';
        $round_names[] = '平成25年度春';
        $round_names[] = '平成25年度秋';
        $round_names[] = '平成26年度春';
        $round_names[] = '平成26年度秋';
        $round_names[] = '平成27年度春';
        $round_names[] = '平成27年度秋';
        $round_names[] = '平成28年度春';
        $round_names[] = '平成28年度秋';
        $round_names[] = '平成29年度春';
        $round_names[] = '平成29年度秋';

        /*
         * ループしてデータを作成
         */
        foreach($round_names as $round_name)
        {
            Round::create([
                'name' => $round_name,
            ]);
        }
    }
}

roundsデータが生成されました。

rounds_data.PNG

問題種別/divitions

divitionsのマイグレーション

2017_12_12_235449_create_divitions_table.php
<?php

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

class CreateDivitionsTable extends Migration
{
    /**
     * マイグレーション実行
     *
     * @return void
     */
    public function up()
    {
        Schema::create('divitions', function (Blueprint $table) {
            $table
                ->increments('id')
                ->comment('ID');

            $table
                ->string('name')
                ->comment('問題種別名');

            $table
                ->timestamp('created_at')
                ->default(DB::raw('CURRENT_TIMESTAMP'))
                ->comment('登録日');

            $table
                ->timestamp('updated_at')
                ->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'))
                ->comment('更新日');
        });
    }

    /**
     * ロールバック時に実行
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('divitions');
    }
}

divisionsテーブルが生成されました。

divisions.PNG

divitionsのシーダー

DivitionsTableSeeder.php
<?php

use Illuminate\Database\Seeder;

/*
 * Eloquentを利用するのでExaminationモデルを使う
 */
use App\Divition;

class DivitionsTableSeeder extends Seeder
{
    /**
     * シーダーを実行
     *
     * @return void
     */
    public function run()
    {
        /*
         * 必要な情報を配列化
         */
        $divition_names[] = 'キーワード';
        $divition_names[] = '読解';
        $divition_names[] = '計算・図・表';

        /*
         * ループしてデータを作成
         */
        foreach($divition_names as $divition_name)
        {
            Divition::create([
                'name' => $divition_name
            ]);
        }
    }
}

divisionsデータが生成されました。

divisions_data.PNG

トップカテゴリ/topcategories

topcategoriesのマイグレーション

2017_12_13_000503_create_topcategories_table.php
<?php

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

class CreateTopcategoriesTable extends Migration
{
    /**
     * マイグレーション実行
     *
     * @return void
     */
    public function up()
    {
        Schema::create('topcategories', function (Blueprint $table) {
            $table
                ->increments('id')
                ->comment('ID');

            $table
                ->string('name')
                ->comment('トップカテゴリ名');

            $table
                ->timestamp('created_at')
                ->default(DB::raw('CURRENT_TIMESTAMP'))
                ->comment('登録日');

            $table
                ->timestamp('updated_at')
                ->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'))
                ->comment('更新日');
        });
    }

    /**
     * ロールバック時に実行
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('topcategories');
    }
}

topcategoriesテーブルが生成されました。

topcategories.PNG

topcategoriesのシーダー

TopcategoriesTableSeeder.php
<?php

use Illuminate\Database\Seeder;

/*
 * Eloquentを利用するのでRoundモデルを使う
 */
use App\Topcategory;

class TopcategoriesTableSeeder extends Seeder
{
    /**
     * シーダーを実行
     *
     * @return void
     */
    public function run()
    {
        /*
         * 必要な情報を配列化
         */
        $topcategory_names[] = 'テクノロジ';
        $topcategory_names[] = 'マネジメント';
        $topcategory_names[] = 'ストラテジ';

        /*
         * ループしてデータを作成
         */
        foreach($topcategory_names as $topcategory_name)
        {
            Topcategory::create([
                'name' => $topcategory_name,
            ]);
        }
    }
}

topcategoriesデータが生成されました。

topcategories_data.PNG

大項目/thirdcategories

thirdcategoriesのマイグレーション

2017_12_13_001134_create_thirdcategories_table.php
<?php

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

class CreateThirdcategoriesTable extends Migration
{
    /**
     * マイグレーション実行
     *
     * @return void
     */
    public function up()
    {
        Schema::create('thirdcategories', function (Blueprint $table) {
            $table
                ->increments('id')
                ->comment('ID');

            $table
                ->string('name')
                ->comment('大項目名');

            $table
                ->integer('topcategory_id')
                ->unsigned()
                ->comment('トップカテゴリID 外部参照 topcategories.id');

            $table
                ->timestamp('created_at')
                ->default(DB::raw('CURRENT_TIMESTAMP'))
                ->comment('登録日');

            $table
                ->timestamp('updated_at')
                ->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'))
                ->comment('更新日');

            /*
             * 外部参照制約 トップカテゴリ
             */
            $table
                ->foreign('topcategory_id')
                ->references('id')
                ->on('topcategories')
                ->onDelete('RESTRICT')
                ->onUpdate('RESTRICT');
        });
    }

    /**
     * ロールバック時に実行
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('thirdcategories');
    }
}

thirdcategoriesテーブルが生成されました。

thirdcategories.PNG

thirdcategoriesのシーダー

ThirdcategoriesTableSeeder.php
<?php

use Illuminate\Database\Seeder;

/*
 * Eloquentを利用するのでRoundモデルを使う
 */
use App\Thirdcategory;

class ThirdcategoriesTableSeeder extends Seeder
{
    /**
     * シーダーを実行
     *
     * @return void
     */
    public function run()
    {
        /*
         * 必要な情報を配列化
         */
        $thirdcategories[1]['topcategory_id'] = 1;
        $thirdcategories[1]['name']           = '基礎理論';
        $thirdcategories[2]['topcategory_id'] = 1;
        $thirdcategories[2]['name']           = 'コンピュータシステム';
        $thirdcategories[3]['topcategory_id'] = 1;
        $thirdcategories[3]['name']           = '技術要素';
        $thirdcategories[4]['topcategory_id'] = 1;
        $thirdcategories[4]['name']           = '開発技術';
        $thirdcategories[5]['topcategory_id'] = 2;
        $thirdcategories[5]['name']           = 'プロジェクトマネジメント';
        $thirdcategories[6]['topcategory_id'] = 2;
        $thirdcategories[6]['name']           = 'サービスマネジメント';
        $thirdcategories[7]['topcategory_id'] = 3;
        $thirdcategories[7]['name']           = 'システム戦略';
        $thirdcategories[8]['topcategory_id'] = 3;
        $thirdcategories[8]['name']           = '経営戦略';
        $thirdcategories[9]['topcategory_id'] = 3;
        $thirdcategories[9]['name']           = '企業と法務';

        /*
         * ループしてデータを作成
         */
        foreach($thirdcategories as $thirdcategory)
        {
            Thirdcategory::create([
                'topcategory_id' => $thirdcategory['topcategory_id'],
                'name'           => $thirdcategory['name'],
            ]);
        }
    }
}

thirdcategoriesデータが生成されました。

thirdcategories_data.PNG

中項目/secondcategories

secondcategoriesのマイグレーション

2017_12_13_004356_create_secondcategories_table.php
<?php

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

class CreateSecondcategoriesTable extends Migration
{
    /**
     * マイグレーション実行
     *
     * @return void
     */
    public function up()
    {
        Schema::create('secondcategories', function (Blueprint $table) {
            $table
                ->increments('id')
                ->comment('ID');

            $table
                ->string('name')
                ->comment('中項目名');

            $table
                ->integer('thirdcategory_id')
                ->unsigned()
                ->comment('大項目ID 外部参照 thirdcategories.id');

            $table
                ->timestamp('created_at')
                ->default(DB::raw('CURRENT_TIMESTAMP'))
                ->comment('登録日');

            $table
                ->timestamp('updated_at')
                ->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'))
                ->comment('更新日');

            /*
             * 外部参照制約 大項目
             */
            $table
                ->foreign('thirdcategory_id')
                ->references('id')
                ->on('thirdcategories')
                ->onDelete('RESTRICT')
                ->onUpdate('RESTRICT');
        });
    }

    /**
     * ロールバック時に実行
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('secondcategories');
    }
}

secondcategoriesテーブルが生成されました。

secondcategories.PNG

secondcategoriesのシーダー

SecondcategoriesTableSeeder.php
<?php

use Illuminate\Database\Seeder;

/*
 * Eloquentを利用するのでRoundモデルを使う
 */
use App\Secondcategory;

class SecondcategoriesTableSeeder extends Seeder
{
    /**
     * シーダーを実行
     *
     * @return void
     */
    public function run()
    {
        /*
         * 必要な情報を配列化
         */
        $secondcategories[1]['thirdcategory_id']  = 1;
        $secondcategories[1]['name']              = '基礎理論';
        $secondcategories[2]['thirdcategory_id']  = 1;
        $secondcategories[2]['name']              = 'アルゴリズムとプログラミング';
        $secondcategories[3]['thirdcategory_id']  = 2;
        $secondcategories[3]['name']              = 'コンピュータ構成要素';
        $secondcategories[4]['thirdcategory_id']  = 2;
        $secondcategories[4]['name']              = 'システム構成要素';
        $secondcategories[5]['thirdcategory_id']  = 2;
        $secondcategories[5]['name']              = 'ソフトウェア';
        $secondcategories[6]['thirdcategory_id']  = 2;
        $secondcategories[6]['name']              = 'ハードウェア';
        $secondcategories[7]['thirdcategory_id']  = 3;
        $secondcategories[7]['name']              = 'ヒューマンインタフェース';
        $secondcategories[8]['thirdcategory_id']  = 3;
        $secondcategories[8]['name']              = 'マルチメディア';
        $secondcategories[9]['thirdcategory_id']  = 3;
        $secondcategories[9]['name']              = 'データベース';
        $secondcategories[10]['thirdcategory_id'] = 3;
        $secondcategories[10]['name']             = 'ネットワーク';
        $secondcategories[11]['thirdcategory_id'] = 3;
        $secondcategories[11]['name']             = 'セキュリティ';
        $secondcategories[12]['thirdcategory_id'] = 4;
        $secondcategories[12]['name']             = 'システム開発技術';
        $secondcategories[13]['thirdcategory_id'] = 4;
        $secondcategories[13]['name']             = 'ソフトウェア開発管理技術';
        $secondcategories[14]['thirdcategory_id'] = 5;
        $secondcategories[14]['name']             = 'プロジェクトマネジメント';
        $secondcategories[15]['thirdcategory_id'] = 6;
        $secondcategories[15]['name']             = 'サービスマネジメント';
        $secondcategories[16]['thirdcategory_id'] = 6;
        $secondcategories[16]['name']             = 'システム監査';
        $secondcategories[17]['thirdcategory_id'] = 7;
        $secondcategories[17]['name']             = 'システム戦略';
        $secondcategories[18]['thirdcategory_id'] = 7;
        $secondcategories[18]['name']             = 'システム企画';
        $secondcategories[19]['thirdcategory_id'] = 8;
        $secondcategories[19]['name']             = '経営戦略マネジメント';
        $secondcategories[20]['thirdcategory_id'] = 8;
        $secondcategories[20]['name']             = '技術戦略マネジメント';
        $secondcategories[21]['thirdcategory_id'] = 8;
        $secondcategories[21]['name']             = 'ビジネスインダストリ';
        $secondcategories[22]['thirdcategory_id'] = 9;
        $secondcategories[22]['name']             = '企業活動';
        $secondcategories[23]['thirdcategory_id'] = 9;
        $secondcategories[23]['name']             = '法務';

        /*
         * ループしてデータを作成
         */
        foreach($secondcategories as $secondcategory)
        {
            Secondcategory::create([
                'thirdcategory_id' => $secondcategory['thirdcategory_id'],
                'name'             => $secondcategory['name'],
            ]);
        }
    }
}

secondcategoriesデータが生成されました。

secondcategories_data.PNG

小項目/firstcategories

firstcategoriesのマイグレーション

2017_12_13_005834_create_firstcategories_table.php
<?php

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

class CreateFirstcategoriesTable extends Migration
{
    /**
     * マイグレーション実行
     *
     * @return void
     */
    public function up()
    {
        Schema::create('firstcategories', function (Blueprint $table) {
            $table
                ->increments('id')
                ->comment('ID');

            $table
                ->string('name')
                ->comment('小項目名');

            $table
                ->integer('secondcategory_id')
                ->unsigned()
                ->comment('中項目ID 外部参照 secondcategories.id');

            $table
                ->timestamp('created_at')
                ->default(DB::raw('CURRENT_TIMESTAMP'))
                ->comment('登録日');

            $table
                ->timestamp('updated_at')
                ->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'))
                ->comment('更新日');

            /*
             * 外部参照制約 中項目
             */
            $table
                ->foreign('secondcategory_id')
                ->references('id')
                ->on('secondcategories')
                ->onDelete('RESTRICT')
                ->onUpdate('RESTRICT');
        });
    }

    /**
     * ロールバック時に実行
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('firstcategories');
    }
}

firstcategoriesテーブルが生成されました。

firstcategories.PNG

firstcategoriesのシーダー

FirstcategoriesTableSeeder.php
<?php

use Illuminate\Database\Seeder;

/*
 * Eloquentを利用するのでRoundモデルを使う
 */
use App\Firstcategory;

class FirstcategoriesTableSeeder extends Seeder
{
    /**
     * シーダーを実行
     *
     * @return void
     */
    public function run()
    {
        /*
         * 必要な情報を配列化
         */
        $firstcategories[1]['secondcategory_id']  = 1;
        $firstcategories[1]['name']               = '離散数学';

        $firstcategories[2]['secondcategory_id'] = 1;$firstcategories[2]['name'] = '応用数学';
        $firstcategories[3]['secondcategory_id'] = 1;$firstcategories[3]['name'] = '情報に関する理論';
        $firstcategories[4]['secondcategory_id'] = 1;$firstcategories[4]['name'] = '通信に関する理論';
        $firstcategories[5]['secondcategory_id'] = 1;$firstcategories[5]['name'] = '計測・制御に関する理論';
        $firstcategories[6]['secondcategory_id'] = 2;$firstcategories[6]['name'] = 'データ構造';
        $firstcategories[7]['secondcategory_id'] = 2;$firstcategories[7]['name'] = 'アルゴリズム';
        $firstcategories[8]['secondcategory_id'] = 2;$firstcategories[8]['name'] = 'プログラミング';
        $firstcategories[9]['secondcategory_id'] = 2;$firstcategories[9]['name'] = 'プログラム言語';
        $firstcategories[10]['secondcategory_id'] = 2;$firstcategories[10]['name'] = 'その他の言語';
        $firstcategories[11]['secondcategory_id'] = 3;$firstcategories[11]['name'] = 'プロセッサ';
        $firstcategories[12]['secondcategory_id'] = 3;$firstcategories[12]['name'] = 'メモリ';
        $firstcategories[13]['secondcategory_id'] = 3;$firstcategories[13]['name'] = 'バス';
        $firstcategories[14]['secondcategory_id'] = 3;$firstcategories[14]['name'] = '入出力デバイス';
        $firstcategories[15]['secondcategory_id'] = 3;$firstcategories[15]['name'] = '入出力装置';
        $firstcategories[16]['secondcategory_id'] = 4;$firstcategories[16]['name'] = 'システムの構成';
        $firstcategories[17]['secondcategory_id'] = 4;$firstcategories[17]['name'] = 'システムの評価指標';
        $firstcategories[18]['secondcategory_id'] = 5;$firstcategories[18]['name'] = 'オペレーティングシステム';
        $firstcategories[19]['secondcategory_id'] = 5;$firstcategories[19]['name'] = 'ミドルウェア';
        $firstcategories[20]['secondcategory_id'] = 5;$firstcategories[20]['name'] = 'ファイルシステム';
        $firstcategories[21]['secondcategory_id'] = 5;$firstcategories[21]['name'] = '開発ツール';
        $firstcategories[22]['secondcategory_id'] = 5;$firstcategories[22]['name'] = 'オープンソースソフトウェア';
        $firstcategories[23]['secondcategory_id'] = 6;$firstcategories[23]['name'] = 'ハードウェア';
        $firstcategories[24]['secondcategory_id'] = 7;$firstcategories[24]['name'] = 'ヒューマンインタフェース技術';
        $firstcategories[25]['secondcategory_id'] = 7;$firstcategories[25]['name'] = 'インタフェース設計';
        $firstcategories[26]['secondcategory_id'] = 8;$firstcategories[26]['name'] = 'マルチメディア技術';
        $firstcategories[27]['secondcategory_id'] = 8;$firstcategories[27]['name'] = 'マルチメディア応用';
        $firstcategories[28]['secondcategory_id'] = 9;$firstcategories[28]['name'] = 'データベース方式';
        $firstcategories[29]['secondcategory_id'] = 9;$firstcategories[29]['name'] = 'データベース設計';
        $firstcategories[30]['secondcategory_id'] = 9;$firstcategories[30]['name'] = 'データ操作';
        $firstcategories[31]['secondcategory_id'] = 9;$firstcategories[31]['name'] = 'トランザクション処理';
        $firstcategories[32]['secondcategory_id'] = 9;$firstcategories[32]['name'] = 'データベース応用';
        $firstcategories[33]['secondcategory_id'] = 10;$firstcategories[33]['name'] = 'ネットワーク方式';
        $firstcategories[34]['secondcategory_id'] = 10;$firstcategories[34]['name'] = 'データ通信と制御';
        $firstcategories[35]['secondcategory_id'] = 10;$firstcategories[35]['name'] = '通信プロトコル';
        $firstcategories[36]['secondcategory_id'] = 10;$firstcategories[36]['name'] = 'ネットワーク管理';
        $firstcategories[37]['secondcategory_id'] = 10;$firstcategories[37]['name'] = 'ネットワーク応用';
        $firstcategories[38]['secondcategory_id'] = 11;$firstcategories[38]['name'] = '情報セキュリティ';
        $firstcategories[39]['secondcategory_id'] = 11;$firstcategories[39]['name'] = '情報セキュリティ管理';
        $firstcategories[40]['secondcategory_id'] = 11;$firstcategories[40]['name'] = 'セキュリティ技術評価';
        $firstcategories[41]['secondcategory_id'] = 11;$firstcategories[41]['name'] = '情報セキュリティ対策';
        $firstcategories[42]['secondcategory_id'] = 11;$firstcategories[42]['name'] = 'セキュリティ実装技術';
        $firstcategories[43]['secondcategory_id'] = 12;$firstcategories[43]['name'] = 'システム要件定義';
        $firstcategories[44]['secondcategory_id'] = 12;$firstcategories[44]['name'] = 'システム方式設計';
        $firstcategories[45]['secondcategory_id'] = 12;$firstcategories[45]['name'] = 'ソフトウェア要件定義';
        $firstcategories[46]['secondcategory_id'] = 12;$firstcategories[46]['name'] = 'ソフトウェア方式設計・ソフトウェア詳細設計';
        $firstcategories[47]['secondcategory_id'] = 12;$firstcategories[47]['name'] = 'ソフトウェア構築';
        $firstcategories[48]['secondcategory_id'] = 12;$firstcategories[48]['name'] = 'ソフトウェア結合・ソフトウェア適格性確認テスト';
        $firstcategories[49]['secondcategory_id'] = 12;$firstcategories[49]['name'] = 'システム結合・システム適格性確認テスト';
        $firstcategories[50]['secondcategory_id'] = 12;$firstcategories[50]['name'] = '導入';
        $firstcategories[51]['secondcategory_id'] = 12;$firstcategories[51]['name'] = '受入れ支援';
        $firstcategories[52]['secondcategory_id'] = 12;$firstcategories[52]['name'] = '保守・廃棄';
        $firstcategories[53]['secondcategory_id'] = 13;$firstcategories[53]['name'] = '開発プロセス・手法';
        $firstcategories[54]['secondcategory_id'] = 13;$firstcategories[54]['name'] = '知的財産適用管理';
        $firstcategories[55]['secondcategory_id'] = 13;$firstcategories[55]['name'] = '開発環境管理';
        $firstcategories[56]['secondcategory_id'] = 13;$firstcategories[56]['name'] = '構成管理・変更管理';
        $firstcategories[57]['secondcategory_id'] = 14;$firstcategories[57]['name'] = 'プロジェクトマネジメント';
        $firstcategories[58]['secondcategory_id'] = 14;$firstcategories[58]['name'] = 'プロジェクト統合マネジメント';
        $firstcategories[59]['secondcategory_id'] = 14;$firstcategories[59]['name'] = 'プロジェクトステークホルダマネジメント';
        $firstcategories[60]['secondcategory_id'] = 14;$firstcategories[60]['name'] = 'プロジェクトスコープマネジメント';
        $firstcategories[61]['secondcategory_id'] = 14;$firstcategories[61]['name'] = 'プロジェクト資源マネジメント';
        $firstcategories[62]['secondcategory_id'] = 14;$firstcategories[62]['name'] = 'プロジェクトタイムマネジメント';
        $firstcategories[63]['secondcategory_id'] = 14;$firstcategories[63]['name'] = 'プロジェクトコストマネジメント';
        $firstcategories[64]['secondcategory_id'] = 14;$firstcategories[64]['name'] = 'プロジェクトリスクマネジメント';
        $firstcategories[65]['secondcategory_id'] = 14;$firstcategories[65]['name'] = 'プロジェクト品質マネジメント';
        $firstcategories[66]['secondcategory_id'] = 14;$firstcategories[66]['name'] = 'プロジェクト調達マネジメント';
        $firstcategories[67]['secondcategory_id'] = 14;$firstcategories[67]['name'] = 'プロジェクトコミュニケーションマネジメント';
        $firstcategories[68]['secondcategory_id'] = 15;$firstcategories[68]['name'] = 'サービスマネジメント';
        $firstcategories[69]['secondcategory_id'] = 15;$firstcategories[69]['name'] = 'サービスの設計・移行';
        $firstcategories[70]['secondcategory_id'] = 15;$firstcategories[70]['name'] = 'サービスマネジメントプロセス';
        $firstcategories[71]['secondcategory_id'] = 15;$firstcategories[71]['name'] = 'サービスの運用';
        $firstcategories[72]['secondcategory_id'] = 15;$firstcategories[72]['name'] = 'ファシリティマネジメント';
        $firstcategories[73]['secondcategory_id'] = 16;$firstcategories[73]['name'] = 'システム監査';
        $firstcategories[74]['secondcategory_id'] = 16;$firstcategories[74]['name'] = '内部統制';
        $firstcategories[75]['secondcategory_id'] = 17;$firstcategories[75]['name'] = '情報システム戦略';
        $firstcategories[76]['secondcategory_id'] = 17;$firstcategories[76]['name'] = '業務プロセス';
        $firstcategories[77]['secondcategory_id'] = 17;$firstcategories[77]['name'] = 'ソリューションビジネス';
        $firstcategories[78]['secondcategory_id'] = 17;$firstcategories[78]['name'] = 'システム活用促進・評価';
        $firstcategories[79]['secondcategory_id'] = 18;$firstcategories[79]['name'] = 'システム化計画';
        $firstcategories[80]['secondcategory_id'] = 18;$firstcategories[80]['name'] = '要件定義';
        $firstcategories[81]['secondcategory_id'] = 18;$firstcategories[81]['name'] = '調達計画・実施';
        $firstcategories[82]['secondcategory_id'] = 19;$firstcategories[82]['name'] = '経営戦略手法';
        $firstcategories[83]['secondcategory_id'] = 19;$firstcategories[83]['name'] = 'マーケティング';
        $firstcategories[84]['secondcategory_id'] = 19;$firstcategories[84]['name'] = 'ビジネス戦略と目標・評価';
        $firstcategories[85]['secondcategory_id'] = 19;$firstcategories[85]['name'] = '経営管理システム';
        $firstcategories[86]['secondcategory_id'] = 20;$firstcategories[86]['name'] = '技術開発戦略の立案';
        $firstcategories[87]['secondcategory_id'] = 20;$firstcategories[87]['name'] = '技術開発計画';
        $firstcategories[88]['secondcategory_id'] = 21;$firstcategories[88]['name'] = 'ビジネスシステム';
        $firstcategories[89]['secondcategory_id'] = 21;$firstcategories[89]['name'] = 'エンジニアリングシステム';
        $firstcategories[90]['secondcategory_id'] = 21;$firstcategories[90]['name'] = 'e-ビジネス';
        $firstcategories[91]['secondcategory_id'] = 21;$firstcategories[91]['name'] = '民生機器';
        $firstcategories[92]['secondcategory_id'] = 21;$firstcategories[92]['name'] = '産業機器';
        $firstcategories[93]['secondcategory_id'] = 22;$firstcategories[93]['name'] = '経営・組織論';
        $firstcategories[94]['secondcategory_id'] = 22;$firstcategories[94]['name'] = 'OR・IE';
        $firstcategories[95]['secondcategory_id'] = 22;$firstcategories[95]['name'] = '会計・財務';
        $firstcategories[96]['secondcategory_id'] = 23;$firstcategories[96]['name'] = '知的財産権';
        $firstcategories[97]['secondcategory_id'] = 23;$firstcategories[97]['name'] = 'セキュリティ関連法規';
        $firstcategories[98]['secondcategory_id'] = 23;$firstcategories[98]['name'] = '労働関連・取引関連法規';
        $firstcategories[99]['secondcategory_id'] = 23;$firstcategories[99]['name'] = 'その他の法律・ガイドライン・技術者倫理';
        $firstcategories[100]['secondcategory_id'] = 23;$firstcategories[100]['name'] = '標準化関連';

        /*
         * ループしてデータを作成
         */
        foreach($firstcategories as $firstcategory)
        {
            Firstcategory::create([
                'secondcategory_id' => $firstcategory['secondcategory_id'],
                'name'              => $firstcategory['name'],
            ]);
        }
    }
}

firstcategoriesデータが生成されました。

firstcategories_data.PNG

問題/questions

questionsのマイグレーション

2017_12_13_012322_create_questions_table.php
<?php

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

class CreateQuestionsTable extends Migration
{
    /**
     * マイグレーション実行
     *
     * @return void
     */
    public function up()
    {
        Schema::create('questions', function (Blueprint $table) {
            $table
                ->increments('id')
                ->comment('ID');

            $table
                ->integer('number')
                ->unsigned()
                ->comment('問題番号');

            $table
                ->text('body')
                ->comment('問題文');

            $table
                ->text('commentary')
                ->comment('解説');

            $table
                ->integer('firstcategory_id')
                ->unsigned()
                ->comment('小項目ID 外部参照 firstcategories.id');

            $table
                ->integer('divition_id')
                ->unsigned()
                ->comment('問題種別ID 外部参照 divitions.id');

            $table
                ->integer('round_id')
                ->unsigned()
                ->comment('試験実施回ID 外部参照 rounds.id');

            $table
                ->integer('examination_id')
                ->unsigned()
                ->comment('試験区分ID 外部参照 examinations.id');

            $table
                ->timestamp('created_at')
                ->default(DB::raw('CURRENT_TIMESTAMP'))
                ->comment('登録日');

            $table
                ->timestamp('updated_at')
                ->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'))
                ->comment('更新日');

            /*
             * 外部参照制約 小項目
             */
            $table
                ->foreign('firstcategory_id')
                ->references('id')
                ->on('firstcategories')
                ->onDelete('RESTRICT')
                ->onUpdate('RESTRICT');

            /*
             * 外部参照制約 問題種別
             */
            $table
                ->foreign('divition_id')
                ->references('id')
                ->on('divitions')
                ->onDelete('RESTRICT')
                ->onUpdate('RESTRICT');

            /*
             * 外部参照制約 試験実施回
             */
            $table
                ->foreign('round_id')
                ->references('id')
                ->on('rounds')
                ->onDelete('RESTRICT')
                ->onUpdate('RESTRICT');

            /*
             * 外部参照制約 試験区分
             */
            $table
                ->foreign('examination_id')
                ->references('id')
                ->on('examinations')
                ->onDelete('RESTRICT')
                ->onUpdate('RESTRICT');

        });
    }

    /**
     * ロールバック時に実行
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('questions');
    }
}

questionsテーブルが生成されました。

questions.PNG

※シーダーはなし

問題/choices

choicesのマイグレーション

2017_12_13_014026_create_choices_table.php
<?php

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

class CreateChoicesTable extends Migration
{
    /**
     * マイグレーション実行
     *
     * @return void
     */
    public function up()
    {
        Schema::create('choices', function (Blueprint $table) {
            $table
                ->increments('id')
                ->comment('ID');

            $table
                ->integer('question_id')
                ->unsigned()
                ->comment('問題文ID 外部参照 questions.id');

            $table
                ->integer('number')
                ->unsigned()
                ->comment('選択肢番号');

            $table
                ->text('body')
                ->comment('選択肢本文');

            $table
                ->integer('correct')
                ->unsigned()
                ->comment('正解');

            $table
                ->timestamp('created_at')
                ->default(DB::raw('CURRENT_TIMESTAMP'))
                ->comment('登録日');

            $table
                ->timestamp('updated_at')
                ->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'))
                ->comment('更新日');

            /*
             * 外部参照制約 問題文
             */
            $table
                ->foreign('question_id')
                ->references('id')
                ->on('questions')
                ->onDelete('RESTRICT')
                ->onUpdate('RESTRICT');
        });
    }

    /**
     * ロールバック時に実行
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('choices');
    }
}

questionsテーブルが生成されました。

choices.PNG

※シーダーはなし