Laravel案件で大量の商品データを流し込むSeederファイルを作ったので、その時使ったコードを紹介する。

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class ProductMasterSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // 実行前に全データ削除
        DB::table('product_masters')->truncate();

        // CSVファイルを開く
        $fp = fopen(__DIR__ . '/../seed_csv/product_masters.csv', 'r');
        $loop_index = 0;
        $insert_data = [];

        while (($data = fgetcsv($fp)) !== false) {
            $loop_index++;

            // 1行目を無視
            if ($loop_index === 1) {
                continue;
            }

            $insert_data[] = [
                'product_code' => $data[0],
                'product_name' => $data[1],
            ];
        }
        
        DB::table('ec_m_product_masters')->insert($insert_data);

        // CSVファイルを閉じる
        fclose($fp);
    }
}

やっていることは単純で、まずSeeder実行前にデータが残っていたら色々面倒なので全データを削除する。

次に指定したパスのファイルを開き、while文で1行ずつデータを読み込んでいく。

CSVファイルの1行目が見出しの場合はcontinueでスキップさせているが、見出しがない場合は28〜31行目は削除でOK。

ループ内では$insert_dataに登録するデータを配列として保存し、最後に40行目でデータ登録を実行。

これで、Seederを使ってCSVファイルから大量のデータを一括登録することができるようになった。