LoginSignup
1
0

Laravel 学校APIから全ての大学をデータベースに保存する方法

Posted at

日本の大学を取得する必要があったので、こちらのAPIを使用しました
https://api.edu-data.jp/

学校APIのサイトでユーザー登録して、トークンを発行します。
発行したトークをenvファイルに記述します。

.env
UNIVERSITY_API_KEY="発行したトークン"
app/config/services.php
  'universities' => [
        'key' => env('UNIVERSITY_API_KEY'),
    ],

Guzzleのラッパーを導入

composer require guzzlehttp/guzzle

大学テーブル作成

php artisan make:model University -m
マイグレーションファイル
<?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('universities', function (Blueprint $table) {
            $table->id();
            $table->string('name');

            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('universities');
    }
};
モデル
Universtiy.php
<?php

namespace App\Models;

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

class University extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
    ];
}

大学シーダー作成

php artisan make:seeder UniversitySeeder

学校APIで取得される大学のschool_type_codeF1なのでリクエストヘッダ内で指定します。

ヘッダーは、withHeadersメソッドを使用してリクエストに追加できます。このwithHeadersメソッドは、キー/値ペアの配列を引数に取ります。

HTTP上のAPI認証方法としてAuthorization ヘッダーに Bearer トークンを設定し、Accept ヘッダーには受け取りたいレスポンスの形式として application/json を指定しています。

UniversitiesSeederファイル
<?php

namespace Database\Seeders;

use App\Models\University;
use GuzzleHttp\Client;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;

class UniversitiesSeeder extends Seeder
{
    /**
     * 学校APIから全ての大学を取得し、データベースに保存する
     */
    public function run()
    {
        // APIリクエストのオプションを設定
        $response = Http::withHeaders([
                                            //ここでトークン指定
            'Authorization' => 'Bearer ' . config('services.universities.key'),
            'Accept' => 'application/json',
        ])->get('https://api.edu-data.jp/api/v1/school?school_type_code=F1');

        $data = json_decode($response->getBody()->getContents(), true);

        //大学名のみを取得し、データベースに保存
        if ($response->getStatusCode() == 200 && isset($data['schools'])) {
            $universities = $data['schools']['data'];
            foreach ($universities as $university) {
                University::create([
                    'name' => $university['school_name'], // 大学名
                ]);
            }
        } else {
            // レスポンスが200以外の場合、または$dataが期待する構造でない場合のエラーハンドリング
            Log::error('Failed to fetch universities data from API.', ['status' => $response->getStatusCode()]);
            return null;
        }
    }
}

シーダー実行

php artisan db:seed --class=UniversitySeeder

データベースにAPIで取得した大学が入ります。

1
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
1
0