LaravelでDBへ一括でデータをINSERTする方法を確認しておく

明日以降に対応予定のデータ一括挿入について予習しておく。

今回はLaravelを使用。
DBはPostgre。
データはスプレッドシートにまとまっている。





## 挿入はSeederさんに任せましょう

Seederは初期データやテストデータをDBに一括で入れ込めるLaravelの機能。

Seederクラスを作成して利用する。

コマンド

    php artisan make:seeder UsersTableSeeder


### Seederクラスの基本形


    <?php
    
    namespace Database\Seeders;

    //Seeder呼び出し
    use Illuminate\Database\Seeder;
    use Illuminate\Support\Facades\DB;
    use Illuminate\Support\Str;

    //Seederはrunメソッドを利用
    class UsersTableSeeder extends Seeder
    {
    
        public function run()
        {
            DB::table('users')->insert([
                'name' => 'John Doe',
                'email' => 'john@example.com',
                'password' => bcrypt('secret'),
                'remember_token' => Str::random(10),
            ]);
        }
    }


### DatabaseSeederの基本形



    public function run()
    {
        $this->call([
            UsersTableSeeder::class,
            PostsTableSeeder::class,
            // 他のSeederクラスも追加可能
        ]);
    }


上記のように複数のSeederを一括で呼び出しを行う事ができる


### Laravelでの利用方法

スプレッドシートをCSV形式で出力しておく。

その後開発環境配下にファイルを置く。

Seederファイルを作成

    <<<<?php
    //Seederクラスを呼び出し
    use Illuminate\Database\Seeder;
    //Seederを継承
    class InitialDataSeeder extends Seeder
    {
        public function run()
        {
            // CSVファイルのパスを指定（database/seeds/~~~~）
            $csvFile = database_path('seeds/◯◯.csv');
            //fopen()を使ってread専用で開く。
            $handle = fopen($csvFile, 'r');
            $data = [];
    
            // CSVの各行をループ
            while (($row = fgetcsv($handle)) !== false) {
                // A列が'name'、B列が'number'の場合
                $data[] = [
                    'name'   => $row[0],
                    'number' => $row[1],
                ];
            }
            //closeさせる
            fclose($handle);
    
            // データを一括挿入
            DB::table('your_table_name')->insert($data);
        }
    }

### DatabaeSeederでSeeder呼び出す。

database/seeds/DatavaseSeeder.phpを作成

先ほど作成したファイルを呼ぶ。

    public function run()
    {
        $this->call(InitialDataSeeder::class);
    }

### マイグレーションファイルで実行する方法

    <?php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Support\Facades\DB;
    
    class UpdateYourTableWithCsvData extends Migration
    {
        public function up()
        {
           
    
            // CSVファイルのパスを指定
            $csvPath = database_path('migrations/data/yourdata.csv');
            if (!file_exists($csvPath)) {
                throw new Exception("CSVファイルが存在しません: {$csvPath}");
            }
    
            // CSVファイルを読み込み、データを整形して一括挿入
            $data = [];
            if (($handle = fopen($csvPath, 'r')) !== false) {
                // ヘッダーがある場合は1行目を読み飛ばす
                // fgetcsv($handle);
                while (($row = fgetcsv($handle, 1000, ",")) !== false) {
                    // A列を「name」、B列を「number」とする例
                    $data[] = [
                        'name'   => $row[0],
                        'number' => $row[1],

                    ];
                }
                fclose($handle);
            }
    
            if (!empty($data)) {
                DB::table('your_table')->insert($data);
            }
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            // down() では元に戻す処理を記述（例：該当レコードの削除）
            // 必要に応じて適切なロールバック処理を実装してください。
            DB::table('your_table')->truncate();
        }
    }

これを見る限りだとupメソッドにさきほどまで記載したコードを反映させるだけだ。

つまりSeederを利用すれば一括挿入は意外と簡単！なはず。

明日実践し、躓いたらまた追記します。