0
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-21

お約束事

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

全体の流れ

  • 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ファイルをテーブル構造通りに記述する

作成された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

※何をしたかわかりやすい名前がよいと思います。

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

※何をしたかわかりやすい名前がよいと思います。

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ファイルを投入したいデータに合わせて記述する

作成された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
            ]);
        }
    }
}

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.

※数百件レベルのデータなら秒で終わるので負荷とかは検討していません。

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1