LaravelのSeederでデータを登録するときに、CSVまたはJSONを使用してデータ登録をする方法を書いています。
CSVデータファイルまたはJSONデータファイルを使用して登録する2つのサンプルコードを載せています。
Laravelのバージョンは8を使用しています。
サンプルコードの概要
今回はLaravelのSeederで、CSVまたはJSON形式のデータファイルを使用してデータを登録します。
Membersテーブルを下記の記事で用意しているので、このテーブルに対してSeederを使用してデータ登録してみます。
LaravelのEloquentで論理削除を使う方法!
テーブルの内容は下記になります。(テーブルのcreate文です)
CREATE TABLE IF NOT EXISTS "members"(
"id" integer not null primary key autoincrement,
"name" varchar not null,
"gender" tinyint(1) not null,
"age" integer not null,
"address" varchar not null,
"tel" varchar not null,
"deleted_at" datetime null,
"created_at" datetime null,
"updated_at" datetime null
);
そして、登録するためのデータをdatabase/seeders/dataディレクトリ配下に、下記のようにmembers.csvとmembers.jsonを用意しました。

SeederでJSONを使用してデータ登録する
JSONを使用してSeederでMembersテーブルに対して、データ登録します。
最初に下記のコマンドで、Seederファイルを作成しました。
$ php artisan make:seeder AddMembersJson
サンプルコード
作成したファイルを下記のように修正しました。
<?php
namespace Database\Seeders;
use App\Models\Member;
use Illuminate\Database\Seeder;
class AddMembersJson extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$this->command->info("メンバーの作成を開始します...");
$json = file_get_contents(__DIR__ . '/data/members.json');
$members = json_decode($json, true);
$count = 0;
foreach ($members['members'] as $member) {
Member::create($member);
$count++;
}
$this->command->info("メンバーを{$count}件、作成しました。");
}
}
コードを解説します。
最初にシーダーを実行した時に$this->command->infoで開始メッセージを出すようにしました。
次にデータファイルの内容を取得します。
PHPのfile_get_contents関数を使用しています。
__DIR__と書くと、PHPで現在実行しているPHPファイルのディレクトリの絶対パスを取得できます。
現在のディレクトリと同じ位置の/data/members.jsonにデータを置いているので、これで取得することが可能です。
データを取得したら$json変数に内容を入れた後に次の行で、json_decode関数を使用して、jsonから配列にデータを変換しています。
$members = json_decode($json, true);
第2引数をtrueにすることによって、スタンダードクラスではなく配列で取ってきています。
その後は、foreach文を使用して、データを1件ずつ登録しています。
$count変数を使用することによって、登録回数をカウントしています。
foreach ($members['members'] as $member) {
Member::create($member);
$count++;
}
最後に登録した件数を下記のようにして、コンソールに出力するようにしました。
$this->command->info("メンバーを{$count}件、作成しました。");
JSONデータ
今回登録に使用したJSONデータは下記になります。
4件のデータを用意しました。
{
"members" : [
{
"name": "taro",
"gender": 0,
"age": 22,
"address": "福岡県博多区1",
"tel": "080-0000-0001"
},
{
"name": "jiro",
"gender": 0,
"age": 20,
"address": "福岡県博多区2",
"tel": "080-0000-0002"
},
{
"name": "saburo",
"gender": 0,
"age": 18,
"address": "福岡県博多区3",
"tel": "080-0000-0003"
},
{
"name": "hanako",
"gender": 1,
"age": 21,
"address": "福岡県博多区4",
"tel": "080-0000-0004"
}
]
}
動作確認する
実際に動作を確認してみます。
artisanコマンドでシーダーを指定して実行します。
下記のように指定して、実行しました。
$ php artisan db:seed --class AddMembersJson
実行すると、このようにデータが4件登録されたことが確認できました。
$ php artisan db:seed --class AddMembersJson
メンバーの作成を開始します...
メンバーを4件、作成しました。
テーブルを確認すると、下記のように登録されました。

SeederでCSVを使用してデータ登録する
次はCSVを使用してSeederでMembersテーブルに対して、データ登録します。
最初に下記のコマンドで、Seederファイルを作成しました。
$ php artisan make:seeder AddMembersCsv
サンプルコード
作成したファイルを下記のように修正しました。
<?php
namespace Database\Seeders;
use App\Models\Member;
use Illuminate\Database\Seeder;
class AddMembersCsv extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$this->command->info("メンバーの作成を開始します...");
$memberSplFileObject = new \SplFileObject(__DIR__ . '/data/members.csv');
$memberSplFileObject->setFlags(
\SplFileObject::READ_CSV |
\SplFileObject::READ_AHEAD |
\SplFileObject::SKIP_EMPTY |
\SplFileObject::DROP_NEW_LINE
);
$count = 0;
foreach ($memberSplFileObject as $key => $row) {
if ($key === 0) {
continue;
}
Member::create([
'name' => trim($row[0]),
'gender' => trim($row[1]),
'age' => trim($row[2]),
'address' => trim($row[3]),
'tel' => trim($row[4]),
]);
$count++;
}
$this->command->info("メンバーを{$count}件、作成しました。");
}
}
コードを解説します。
先ほどと同様に最初に$this->command->infoを使用して、処理を開始するメッセージを表示しています。
その後にPHPのSplFileObjectを使用して、CSVを読み込んでいます。
CSVを読み込む時の設定をsetFlagsメソッドを使用して設定しています。
読み込んだCSVの内容が$memberSplFileObject変数に入っているので、foreachでループしています。
$keyは0番目から始まって、CSVの行数分になります。
0行目はCSVヘッダーということを想定して、0番目だった場合はcontinueするようにしています。
if ($key === 0) {
continue;
}
その後に、それぞれのデータを取り出して、Memberモデルを使用して登録するようにしました。
Member::create([
'name' => trim($row[0]),
'gender' => trim($row[1]),
'age' => trim($row[2]),
'address' => trim($row[3]),
'tel' => trim($row[4]),
]);
最後にカウントしたCSV行数を終了メッセージと一緒に出力しています。
CSVデータ
今回登録に使用したCSVデータは下記になります。
今回も4件のデータを作成しました。
name, gender, age, address, tel
山田, 0, 24, 東京都港区1, 080-0001-0001
鈴木, 0, 25, 福岡県博多区10, 080-0001-0002
佐藤, 0, 19, 長崎県長崎市3, 080-0001-0003
中村, 0, 24, 大分県大分市1, 080-0001-0004
動作確認する
artisanコマンドで作成したAddMembersCsvシーダーを指定して、下記のように実行しました。
$ php artisan db:seed --class AddMembersCsv
4件のデータが登録できたことが確認できました。
$ php artisan db:seed --class AddMembersCsv
メンバーの作成を開始します...
メンバーを4件、作成しました。
Database seeding completed successfully.
テーブルを確認すると、下記のように登録されました。

関連記事
今回のコードの内容に関連する記事のリンクです。
LaravelでSeederを使う方法!(初期データを登録する)
・Eloquentでの登録について
LaravelでEloquentの使い方(更新・追加・取得・削除)
・json_decodeについて
[php標準関数]json_encode, json_decodeについて

コメント