CSVファイルからデータベースにデータを挿入する
web-application-framework laravel
この記事では、LaravelでSeederを使ってCSVファイルからデータを読み込み、データベースに挿入する方法について解説します。
Seederとは?
LaravelにおけるSeederとは、任意のデータをデータベースに挿入するための機能です。
参考
環境
- Laravel 11
- SQLite 3
作業の流れ
1. テーブルを作成する
tests
テーブルを作成します。今回はSQLiteを使用しています。
以下のArtisanコマンドを実行して、Test
モデルとマイグレーションを作成します。
php artisan make:model Test --migration
生成されたマイグレーションファイルを以下のように編集します。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('tests', function (Blueprint $table) {
$table->id('id');
$table->string('name');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('tests');
}
};
マイグレーションを実行します。
php artisan migrate
2. CSVファイルを作成する
tests
テーブル用のCSVファイルを database/data
ディレクトリに tests.csv
という名前で作成します。
1列目が id
カラム、2列目が name
カラムになります。
1,test1
2,test2
3,test3
3. Seederを作成する
以下のArtisanコマンドでSeederクラスを作成します。
ファイルは database/seeders
に生成されます。
php artisan make:seeder TestSeeder
作成された TestSeeder
を次のように編集します。
このコードはCSVファイルからデータを読み込み、tests
テーブルに挿入します。
<?php
namespace Database\Seeders;
use App\Models\Test;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
abstract class TestSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$values = [];
if (($handle = fopen(database_path('data/tests.csv'), 'r')) !== false) {
while (($data = fgetcsv($handle, null, ',')) !== false) {
$values[] = [
'id' => $data[0],
'name' => $data[1],
];
}
fclose($handle);
}
Test::upsert($values, ['id']);
}
}
次に、DatabaseSeeder.php
を以下のように編集します。
<?php
namespace Database\Seeders;
use Database\Seeders\TestSeeder;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
{
$this->call([
TestSeeder::class,
]);
}
}
4. Seederを実行する
以下のコマンドでSeederを実行します
php artisan db:seed
tests
テーブルを確認すると、CSVファイルの内容が挿入されていることが確認できます。
SELECT * FROM `tests`;
1|test1
2|test2
3|test3