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ファイルから大量のデータを一括登録することができるようになった。