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 を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。