MENU

JMS フェーズ2(laravel) 住所DBの更新について

お客様情報の入力ページで郵便番号から住所を表示するという処理を行っており、
住所はDBから参照して表示させる仕組みになってます。
年1回くらいのページで住所DBの更新依頼をいただくため、
その際は下記の内容に沿って実施。

過去ログ:
https://macchialb.backlog.jp/view/P2_LP_REP-55
https://macchialb.backlog.jp/view/P2_LP_REP-100

目次

作業手順

 ①検証環境で差し替え用の住所DB作成
  https://st2.macchialabel.com/ad/ls_8fsp8_5_kta_up_tei_gp3/
 ②検証環境で各種テスト
 ③本番環境で差し替え用の住所DB作成
 ④メンテナンス無しで、ファイルの上書きでリリース

実施内容

①CSVの文字コード変換

先方から連携された住所のCSVファイルの文字コードをサクラエディタ等を使用してutf8に保存し、
下記ディレクトリに格納

/database/seeders

※シフトJISだとDB登録時にエラーになる
※CSVの構成は全部で4列想定(郵便番号、住所カナ、住所漢字、フラグ)

②マイグレーションファイルの作成

新しい住所用のテーブルを作成するためのマイグレーションを作成

php artisan make:migration create_addresses_2025_table

※「addresses_2025」というテーブルを作成する場合。
 いつ時点の住所か後から分かりやすくするため、年代を含めた名称にする

③マイグレーションファイルのスキーマを記述

<?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('addresses_2025', function (Blueprint $table) {
            $table->id();
            $table->integer('ybin_nbr');
            $table->string('jsy_kn_nme');
            $table->string('jsy_kanji_nme');
            $table->boolean('haisi_flg')->default(0);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('addresses_2025');
    }
};

④マイグレーションの実行

php artisan migrate

⑤シーダー実行ファイルの編集

下記ファイルの太文字部分を、新しいDB名および、新しいCSVファイル名に変更
/database/seeders/AddressesSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Seeder;

class AddressesSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $this->command->info("addresses_2025のテーブルを初期化...");
        DB::table('addresses_2025')->truncate();

        $this->command->info("addresses_2025の作成を開始します...");

        $memberSplFileObject = new \SplFileObject(__DIR__ . '/tm_jsy_srch_shis_20250826.csv');
        $memberSplFileObject->setFlags(
            \SplFileObject::READ_CSV |
            \SplFileObject::READ_AHEAD |
            \SplFileObject::SKIP_EMPTY |
            \SplFileObject::DROP_NEW_LINE
        );

        foreach ($memberSplFileObject as $key => $row) {
            //excelでcsvを保存するとBOM付きになるので削除する
            if ($key === 0) {
                $row[0] = preg_replace('/^\xEF\xBB\xBF/', '', $row[0]);
            }

            DB::table('addresses_2025')->insert([
                'ybin_nbr' => (int) trim($row[0]),
                'jsy_kn_nme' => trim($row[1]),
                'jsy_kanji_nme' => trim($row[2]),
                'haisi_flg' => (int) trim($row[3]),
                'created_at' => now(),
                'updated_at' => now(),
            ]);
        }
        $this->command->info("addresses_2025を作成しました。");
    }
}

⑥CSVファイルからDBを作成するコマンドの実行

php artisan db:seed --class=AddressesSeeder

⑦新しい住所DB用のモデルを作成

php artisan make:model Address2025

※いつ時点の住所か後から分かりやすくするため、年代を含めた名称にする

⑧モデルファイル内で参照するテーブルの明示

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Address2025 extends Model
{
    use HasFactory;
    
    // このモデルが addresses_2025 テーブルを参照することを明示的に指定
    protected $table = 'addresses_2025';
}

⑨参照モデルの変更

下記ファイルの太文字部分を新しいモデルに変更

/app/Http/Controllers/Api/AddressController.php

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
// use App\Models\Address;
use App\Models\Address2025; // 2025年用のDBテーブルを参照するモデル
use Illuminate\Http\Request;

class AddressController extends Controller
{
    public function address($zip)
    {
        // 参照するモデルを Address2025 に指定
        $address = Address2025::where('ybin_nbr', intval($zip))
                            ->where('haisi_flg', 0)
                            ->get();
        return response()->json(
            $address,
            200,
            [],
            JSON_UNESCAPED_UNICODE
        );
    }
}

⑩上記処理を実施後、検証環境で動作確認

https://st2.macchialabel.com/ad/ls_8fsp8_5_kta_up_tei_gp3

旧住所情報と、新住所情報で差分がある郵便番号でちゃんと新しい内容が表示されているか確認。
下記ディレクトリに旧CSVファイルと新CSVファイルを、
「旧_CSVファイル名.csv」「新_CSVファイル名.csv」に変更して格納。

/database/seeders/新旧データ比較

新旧比較.xlsxを開き、
「データ>すべて更新」でPowerQueryを実行

実行が完了すると、
「旧のみ」シートには旧データにしか存在しない住所、
「新のみ」シートには新データにしか存在しない住所、
が抽出されてくるので、そこのデータをピックアップして確認。

問題がなければ本番環境へ反映

本番環境で作業を行う時、ファイル作成はコマンドで行わなくても、
検証時に作成したファイルをFTP経由でそのままアップロードすればOK。

ただし、④⑥のコマンドは本番環境でも実施する必要あり。

⑧のファイルは必ず本番環境で新しい住所テーブルの作成が作成された後にアップデートする。
住所テーブル作成前にファイルをアップしてしまうと、参照するテーブルが存在せず、
エラーになってしまう。

この記事を書いた人

目次