今回はLaravelでCSVから初期データを取得してSQLiteを使う方法をまとめます。
- SQLite環境設定
- マイグレーションの作成
- シーダーの作成
- モデルの作成
- コントローラーの修正
SQLite環境設定
Laravelのデータベース設定は.env
ファイルにDB接続情報を保持しています。
.env
ファイルを編集し、データベースドライバーをsqliteに変更します。
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
ディレクトリに作成されます。
$ php artisan make:migration create_elements_table
生成されたマイグレーションファイルを編集し、elementsテーブル情報を記述します。
<?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テーブルを作成します。
$ php artisan migrate
INFO Running migrations.
2024_08_10_094553_create_elements_table ...................................... 2.07ms DONE
以下のようにsqlite3を使って確認できます。
$ 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ディレクトリに保存します。
event,element_group,name,alias,difficulty,row_number
1,1,倒立から下ろして(開脚前挙or脚前挙)支持(2秒),,1,1
2,1,脚上挙支持(2秒),,2,1
次に、CSVファイルからデータを読み込んでデータベースに登録するためのシーダーを作成します。
$ php artisan make:seeder ElementsTableSeeder
ElementsTableSeeder.php
ファイルはdatabase/seeders
ディレクトリに作成されます。
作成されたシーダーファイルを編集して、CSVファイルを読み込む処理を追加します。
<?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
にシーダーを登録します。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call(ElementsTableSeeder::class);
}
}
シーダーを実行して、CSVファイルのデータをデータベースに登録します。
$ php artisan db:seed
INFO Seeding database.
Database\Seeders\ElementsTableSeeder .......................................... RUNNING
Database\Seeders\ElementsTableSeeder ....................................... 18 ms DONE
sqliteコマンドで確認します。
sqlite> SELECT * FROM elements;
1|1|1|倒立から下ろして(開脚前挙or脚前挙)支持(2秒)||1|1||
2|2|1|脚上挙支持(2秒)||2|1||
モデルの作成
SQLiteからデータを取得するためにElementモデルを作成します。
$ php artisan make:model Element
これによりapp/Models/Element.php
が生成されます。
生成された Element.php ファイルを開き、$fillable プロパティを設定して、データベースのカラムに対応するフィールドを指定します。
<?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
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を使う方法でした。
- SQLite環境設定
- マイグレーションの作成
- シーダーの作成
- モデルの作成
- コントローラーの修正
を解説してきました。
Laravelの「Eloquent ORM (Object-Relational Mapping)」によってデータベース操作が簡単にできます。
ぜひ参考にしてみてください。
コメント