0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

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

今回は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を利用すれば一括挿入は意外と簡単!なはず。

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?