Laravel 初期データをセットする(シーダー機能+CSVファイル)

Laravelで開発をしていると、初期データとして大量のレコード(CSVファイル)をDBに流し込む作業はよく発生したりします。

そんなとき、自分の場合は "goodby/csv" というパッケージを使って、シーダー機能でCSVデータを流し込みます。

今回はシーダー機能を使ってのCSVファイルのインポートについてエントリーします。

 

やりたいこと

サイトを作るときに必ずと言っていいほど作る "都道府県マスタ"

都道府県テーブルを作成し、都道府県のCSVデータをLaravelのシーダー機能を使ってインポートします。

 

手順

パッケージのインストール

Composer で「goodby csv」パッケージをインストールします。


$ composer require "goodby/csv":"1.2.0"

 

Composerコマンドの使い方については以下をご参考ください。

 

テーブルの作成(マイグレーション)

マイグレーションファイルの作成。


php artisan make:migration create_prefs_table --create=prefs

 

自動生成されたマイグレーションファイル(database/migrations/****_**_create_prefs_table.php)を以下のようにコーディングします。


// テーブルとカラムの作成
public function up()
{
    Schema::create('prefs', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('code')->comment('コード');
        $table->string('name')->comment('都道府県名');
        $table->timestamps();
    });
}

// ロールバックの処理
public function down()
{
    Schema::dropIfExists('prefs');
}

 

マイグレーションの実行


php artisan migrate

 

これで「都道府県」のテーブルは作成できました。

 

モデルの作成

「都道府県」テーブルのモデルを作成します。

artisanコマンドでスケルトンの作成。


php artisan make:model Pref

 

自動生成されたモデルに中身を入れていきます。


namespace App;

use Illuminate\Database\Eloquent\Model;

class Pref extends Model
{
    protected $fillable = [
                  'code'
                  , 'name'
                        ];
}

 

CSVファイルの用意

以下のようなCSVファイルを用意します。

database/seeds/pref_utf8.csv に設置します。


"pref_id","pref"
1,"北海道"
2,"青森県"
3,"岩手県"
4,"宮城県"
5,"秋田県"
6,"山形県"
7,"福島県"
8,"茨城県"
9,"栃木県"
10,"群馬県"
11,"埼玉県"
12,"千葉県"
13,"東京都"
14,"神奈川県"
15,"新潟県"
16,"富山県"
17,"石川県"
18,"福井県"
19,"山梨県"
20,"長野県"
21,"岐阜県"
22,"静岡県"
23,"愛知県"
24,"三重県"
25,"滋賀県"
26,"京都府"
27,"大阪府"
28,"兵庫県"
29,"奈良県"
30,"和歌山県"
31,"鳥取県"
32,"岡山県"
33,"広島県"
34,"島根県"
35,"山口県"
36,"徳島県"
37,"香川県"
38,"高知県"
39,"愛媛県"
40,"福岡県"
41,"佐賀県"
42,"長崎県"
43,"大分県"
44,"熊本県"
45,"宮崎県"
46,"鹿児島県"
47,"沖縄県"
48,"全国"

 

シーダーファイルの編集

シーダーファイルのスケルトン作成。


php artisan make:seeder PrefTableSeeder

 

自動生成されたシーダーファイル(PrefTableSeeder)を編集。


use Illuminate\Database\Seeder;

use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\LexerConfig;

class PrefTableSeeder extends Seeder
{
    const CSV_FILENAME = '/../database/seeds/pref_utf8.csv'; //appからの相対パス

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->command->info('[Start] import data.');

        $config = new LexerConfig();
        // セパレーター指定、"\t"を指定すればtsvファイルとかも取り込めます
        $config->setDelimiter(",");
        // 1行目をスキップ
        $config->setIgnoreHeaderLine(true);
        $lexer = new Lexer($config);
        $interpreter = new Interpreter();
        $interpreter->addObserver(function(array $row) {
            // 登録処理
            $pref = \App\Pref::create([
                    'code' => $row[0], //
                    'name' => $row[1], //
               ]);
        });

        $lexer->parse(app_path() . self::CSV_FILENAME, $interpreter);

        $this->command->info('[End] import data.');
    }
}

 

シーダーの実行

シーダーの実行


php artisan db:seed --class=PrefTableSeeder

 

実演

 

確認作業

CSVのデータがデータベースにちゃんと入っているか確認します。

下記のようになっていればOKです。

 
以上です。

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-実践知識