Laravel | 都道府県マスタを追加し、APIと管理画面から管理する方法

この記事では、Laravelで都道府県マスタを追加し、それを利用してスポット情報を管理する方法を紹介します。また、都道府県データを取得できるAPIの作成や、管理画面から都道府県マスタを管理する手順についても解説します。

この記事は、これまでに公開した次の記事とも関連していますので、合わせてご覧ください。

これらの記事では、スポット情報を管理・表示するAPIおよび管理画面を作成しましたが、本記事ではそのデータ構造を拡張し、都道府県マスタの追加と、APIおよび管理画面からの管理方法を紹介します。

1. 都道府県マスタの作成

まず、都道府県マスタをデータベースに作成します。マイグレーションを使ってテーブルを定義し、都道府県データを管理します。

マイグレーションの作成

都道府県を管理するためのテーブルを作成するマイグレーションを作成します。

./vendor/bin/sail artisan make:migration create_prefectures_table

次に、作成されたマイグレーションファイルに都道府県マスタの定義を追加します。

database/migrations/xxxx_xx_xx_xxxxxx_create_prefectures_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePrefecturesTable extends Migration
{
    public function up()
    {
        Schema::create('prefectures', function (Blueprint $table) {
            $table->id();
            $table->string('name'); // 都道府県名
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('prefectures');
    }
}

都道府県データを追加するSeeder

次に、都道府県データを追加するためのSeederを作成します。これにより、全都道府県のデータを簡単にデータベースに挿入できます。

./vendor/bin/sail artisan make:seeder PrefectureSeeder

database/seeders/PrefectureSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class PrefectureSeeder extends Seeder
{
    public function run()
    {
        $prefectures = [
            ['name' => '北海道'],
            ['name' => '青森県'],
            ['name' => '岩手県'],
            // ... 他の都道府県もここに追加
            ['name' => '沖縄県'],
        ];

        DB::table('prefectures')->insert($prefectures);
    }
}

Seederを実行して都道府県データを挿入します。

./vendor/bin/sail artisan db:seed --class=PrefectureSeeder

2. スポットテーブルに都道府県IDを追加

次に、スポットテーブルに prefecture_id カラムを追加し、都道府県マスタと紐付けます。

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

./vendor/bin/sail artisan make:migration update_spots_table_add_prefecture_id

database/migrations/xxxx_xx_xx_xxxxxx_update_spots_table_add_prefecture_id.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class UpdateSpotsTableAddPrefectureId extends Migration
{
    public function up()
    {
        Schema::table('spots', function (Blueprint $table) {
            if (!Schema::hasColumn('spots', 'prefecture_id')) {
                $table->unsignedBigInteger('prefecture_id')->after('id');
                $table->foreign('prefecture_id')->references('id')->on('prefectures')->onDelete('cascade');
                $table->dropColumn('prefecture'); // 古いカラムを削除
            }
        });
    }

    public function down()
    {
        Schema::table('spots', function (Blueprint $table) {
            $table->string('prefecture');
            $table->dropForeign(['prefecture_id']);
            $table->dropColumn('prefecture_id');
        });
    }
}

マイグレーションを実行して、スポットテーブルを更新します。

./vendor/bin/sail artisan migrate

3. 都道府県APIの作成

次に、都道府県マスタのデータを取得できるAPIを作成します。

APIルートの設定

routes/api.php に以下のルートを追加して、都道府県データを返すAPIを作成します。

routes/api.php

use App\Http\Controllers\PrefectureController;

Route::get('/prefectures', [PrefectureController::class, 'index']);

コントローラの作成

API用のコントローラを作成します。

./vendor/bin/sail artisan make:controller PrefectureController

app/Http/Controllers/PrefectureController.php

<?php

namespace App\Http\Controllers;

use App\Models\Prefecture;
use Illuminate\Http\Request;

class PrefectureController extends Controller
{
    public function index()
    {
        return response()->json(Prefecture::all());
    }
}

これで、http://localhost/api/prefectures にアクセスすることで、都道府県マスタのデータをJSON形式で取得できるようになります。


4. 管理画面に都道府県マスタを追加

都道府県マスタを管理画面から確認できるようにするため、コントローラとビューを作成します。

コントローラの作成

./vendor/bin/sail artisan make:controller Admin/PrefectureController

app/Http/Controllers/Admin/PrefectureController.php

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Prefecture;

class PrefectureController extends Controller
{
    public function index()
    {
        $prefectures = Prefecture::all();
        return view('admin.prefectures.index', compact('prefectures'));
    }
}

ルートの設定

管理画面から都道府県マスタにアクセスできるようにルートを追加します。

routes/web.php

use App\Http\Controllers\Admin\PrefectureController as AdminPrefectureController;

Route::prefix('admin')->group(function () {
    Route::get('/prefectures', [AdminPrefectureController::class, 'index'])->name('admin.prefectures.index');
});

ビューの作成

resources/views/admin/prefectures/index.blade.php

@extends('layouts.admin')

@section('title', '都道府県マスタ')

@section('content')
    <h1>都道府県マスタ</h1>

    <table class="table">
        <thead>
            <tr>
                <th>ID</th>
                <th>名前</th>
            </tr>
        </thead>
        <tbody>
            @foreach($prefectures as $prefecture)
                <tr>
                    <td>{{ $prefecture->id }}</td>
                    <td>{{ $prefecture->name }}</td>
                </tr>
            @endforeach
        </tbody>
    </table>
@endsection

これで、http://localhost/admin/prefectures にアクセスして、都道府県マスタを管理画面から確認できるようになります。


5. 関連記事

このプロセスは、以下の2つの記事とも関連しています。こちらも併せてご覧ください。

これらの記事では、スポット情報をAPIおよび管理画面から管理する方法を紹介しています。今回の都道府県マスタの追加は、これらの機能をさらに拡張し、より便利にデータを管理できるようにするためのものです。

コメント

タイトルとURLをコピーしました