LaravelのSeederを使用して、CSVまたはJSONでデータを登録する2つの方法!

Laravel Laravel

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.csvmembers.jsonを用意しました。
Seederで登録するためのCSVと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でJSONを使用してデータ登録する

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.

テーブルを確認すると、下記のように登録されました。

SeederでCSVを使用してデータ登録する

関連記事

今回のコードの内容に関連する記事のリンクです。

コメント

タイトルとURLをコピーしました