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について
コメント