明日以降に対応予定のデータ一括挿入について予習しておく。
今回は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を利用すれば一括挿入は意外と簡単!なはず。
明日実践し、躓いたらまた追記します。