プログラミング

【GymCal】LaravelでSQLiteを使う方法

この記事は約13分で読めます。

今回はLaravelでCSVから初期データを取得してSQLiteを使う方法をまとめます。

  1. SQLite環境設定
  2. マイグレーションの作成
  3. シーダーの作成
  4. モデルの作成
  5. コントローラーの修正

SQLite環境設定

Laravelのデータベース設定は.envファイルにDB接続情報を保持しています。

.envファイルを編集し、データベースドライバーをsqliteに変更します。

.env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:mGX0N97P2t903aHKxqeli675xYBYize+IRuaDA2PDs8=
APP_DEBUG=true
APP_TIMEZONE=UTC
APP_URL=http://localhost

# APP_LOCALE=en
# APP_FALLBACK_LOCALE=en
# APP_FAKER_LOCALE=en_US

# APP_MAINTENANCE_DRIVER=file
# APP_MAINTENANCE_STORE=database

# BCRYPT_ROUNDS=12

# LOG_CHANNEL=stack
# LOG_STACK=single
# LOG_DEPRECATIONS_CHANNEL=null
# LOG_LEVEL=debug

DB_CONNECTION=sqlite
DB_DATABASE=/Users/junyamagami/Developments/gymcal/backend/database/database.sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=

# SESSION_DRIVER=database
# SESSION_LIFETIME=120
# SESSION_ENCRYPT=false
# SESSION_PATH=/
# SESSION_DOMAIN=null

# BROADCAST_CONNECTION=log
# FILESYSTEM_DISK=local
# QUEUE_CONNECTION=database

# CACHE_STORE=database
# CACHE_PREFIX=

# MEMCACHED_HOST=127.0.0.1

# REDIS_CLIENT=phpredis
# REDIS_HOST=127.0.0.1
# REDIS_PASSWORD=null
# REDIS_PORT=6379

# MAIL_MAILER=log
# MAIL_HOST=127.0.0.1
# MAIL_PORT=2525
# MAIL_USERNAME=null
# MAIL_PASSWORD=null
# MAIL_ENCRYPTION=null
# MAIL_FROM_ADDRESS="hello@example.com"
# MAIL_FROM_NAME="${APP_NAME}"

# AWS_ACCESS_KEY_ID=
# AWS_SECRET_ACCESS_KEY=
# AWS_DEFAULT_REGION=us-east-1
# AWS_BUCKET=
# AWS_USE_PATH_STYLE_ENDPOINT=false

# VITE_APP_NAME="${APP_NAME}"

マイグレーションの作成

Laravelは指定のフォーマットで記述した情報に基づいてテーブルを作成します。

以下のコマンドでelementsテーブルを作成するためのマイグレーションファイルを生成します。
マイグレーションファイルはdatabase/migrationsディレクトリに作成されます。

Zsh
$ php artisan make:migration create_elements_table

生成されたマイグレーションファイルを編集し、elementsテーブル情報を記述します。

database/migrations/2024_08_10_094553_create_elements_table.php
<?php

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

return new class extends Migration {
    public function up(): void {
        Schema::create('elements', function (Blueprint $table) {
            $table->id();
            $table->unsignedTinyInteger('event');
            $table->unsignedTinyInteger('element_group');
            $table->string('name');
            $table->string('alias')->nullable();
            $table->unsignedTinyInteger('difficulty');
            $table->unsignedTinyInteger('row_number');
            $table->timestamps();
        });
    }

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

以下のコマンドでマイグレーションを実行してelementsテーブルを作成します。

Zsh
$ php artisan migrate

   INFO  Running migrations.  

  2024_08_10_094553_create_elements_table ...................................... 2.07ms DONE

以下のようにsqlite3を使って確認できます。

Zsh
$ sqlite3 ./database/database.sqlite
SQLite version 3.43.2 2023-10-10 13:08:14
Enter ".help" for usage hints.

sqlite> .tables
cache                  job_batches            sessions             
cache_locks            jobs                   users                
elements               migrations           
failed_jobs            password_reset_tokens

sqlite> .schema elements
CREATE TABLE IF NOT EXISTS "elements" ("id" integer primary key autoincrement not null, "event" integer not null, "element_group" integer not null, "name" varchar not null, "alias" varchar, "difficulty" integer not null, "row_number" integer not null, "created_at" datetime, "updated_at" datetime);

シーダーの作成

Laravelでは初期データを登録するシーダーという機能が用意されています。

今回はCSVから初期データを取得して登録します。

以下のようなelements.csvファイルをstorage/appディレクトリに保存します。

JSON
event,element_group,name,alias,difficulty,row_number
1,1,倒立から下ろして(開脚前挙or脚前挙)支持(2秒),,1,1
2,1,脚上挙支持(2秒),,2,1

次に、CSVファイルからデータを読み込んでデータベースに登録するためのシーダーを作成します。

Zsh
$ php artisan make:seeder ElementsTableSeeder

ElementsTableSeeder.phpファイルはdatabase/seedersディレクトリに作成されます。


作成されたシーダーファイルを編集して、CSVファイルを読み込む処理を追加します。

database/seeders/ElementsTableSeeder.php
<?php

namespace Database\Seeders;

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

class ElementsTableSeeder extends Seeder
{
    public function run(): void
    {
        // CSVファイルを読み込む
        $file = Storage::path('elements.csv');
        $csvData = array_map('str_getcsv', file($file));

        // CSVのヘッダー行を削除
        $header = array_shift($csvData);

        // 各行を処理してデータベースに挿入
        foreach ($csvData as $row) {
            DB::table('elements')->insert([
                'event' => $row[0],
                'element_group' => $row[1],
                'name' => $row[2],
                'alias' => $row[3],
                'difficulty' => $row[4],
                'row_number' => $row[5],
            ]);
        }
    }
}

database/seeders/DatabaseSeeder.php にシーダーを登録します。

database/seeders/DatabaseSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call(ElementsTableSeeder::class);
    }
}

シーダーを実行して、CSVファイルのデータをデータベースに登録します。

Zsh
$ php artisan db:seed

   INFO  Seeding database.  

  Database\Seeders\ElementsTableSeeder .......................................... RUNNING  
  Database\Seeders\ElementsTableSeeder ....................................... 18 ms DONE  

sqliteコマンドで確認します。

Zsh
sqlite> SELECT * FROM elements;
1|1|1|倒立から下ろして(開脚前挙or脚前挙)支持(2秒)||1|1||
2|2|1|脚上挙支持(2秒)||2|1||

モデルの作成

SQLiteからデータを取得するためにElementモデルを作成します。

Zsh
$ php artisan make:model Element

これによりapp/Models/Element.phpが生成されます。

生成された Element.php ファイルを開き、$fillable プロパティを設定して、データベースのカラムに対応するフィールドを指定します。

app/Models/Element.php
<?php

namespace App\Models;

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

class Element extends Model
{
    use HasFactory;

    protected $fillable = [
        'id',
        'event',
        'element_group',
        'name',
        'alias',
        'difficulty',
        'row_number',
    ];
}

コントローラーの修正

ElementController を修正し、データベースから elements テーブルのデータを取得するようにします。

PHP
<?php

namespace App\Http\Controllers;

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

class ElementController extends Controller
{
    public function index()
    {
        // データベースから全ての要素を取得
        $elements = Element::all();

        // JSONでレスポンスを返す
        return response()->json([
            "elements" => $elements
        ], 200, [], JSON_UNESCAPED_UNICODE);
    }
}

これでSQLiteから値を取得できるはずです。
Laravelを起動した状態でhttp://localhost:8000/api/elementsにアクセスします。

SQLiteのデータを取得できました。

まとめ

以上がLaravelでCSVから初期データを取得してSQLiteを使う方法でした。

  1. SQLite環境設定
  2. マイグレーションの作成
  3. シーダーの作成
  4. モデルの作成
  5. コントローラーの修正

を解説してきました。

Laravelの「Eloquent ORM (Object-Relational Mapping)」によってデータベース操作が簡単にできます。

ぜひ参考にしてみてください。

コメント