Laravel Newsで紹介されていた DBML to Laravel Eloquent Generator を使ってみました。

前提条件
- PHP 8.2以降インストール済(パッケージのサポートは8.0以降)
- Composer2.xインストール済
- Laravel12(パッケージのサポートは8以降)
- Ubuntu24.04.2 LTS (WSL2 on Windows11)上で作業していきます
これからやることの概要
- Laravel新規プロジェクト作成
- パッケージインストール
- DBML作成
- DBMLを基にモデル生成
Laravel新規プロジェクト作成
Laravelインストーラー
Laravel新規プロジェクト「dbml2eloquent-model」を作成します。
laravel new dbml2eloquent-model
インストールする starter kit について訊かれるので、好きなものを選択します。

テスティングフレームワークについて訊かれるので、好きな方を選択します。

DBMSについて訊かれるので、それぞれの環境に合わせて選択します。

nodeパッケージのインストールとビルドを実施するか訊かれます。
上記で選択したスタックに合わせて、必要なら実施してください。
筆者はstarter kitは「None」を選択したので「No」を選択します。

パッケージインストール
プロジェクトフォルダに入ります。
cd dbml2eloquent-model

パッケージをインストールします。
composer require egyjs/dbml-to-laravel --dev

編集可能なスタブ(コピー元のEloquent modelテンプレート)をpublishします。
php artisan vendor:publish --tag=dbml-to-laravel-stubs

「stubs/dbml-to-laravel/」が生成されます。
- migration.stub:マイグレーションファイルのテンプレート
- model.stub:モデルのテンプレート
ちなみに、それぞれこんな感じになっています。
▼「migration.stub」
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('{{ tableName }}', function (Blueprint $table) {
$table->id();
{{ fields }}
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('{{ tableName }}');
}
};
▼「model.stub」
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class {{ modelName }} extends Model
{
use HasFactory;
{{ tableProperty }}
protected $fillable = [
{{ fillable }}
];
protected $casts = [
{{ casts }}
];
{{ relations }}
}
以降の変更箇所検出を容易にするために、一度コミットしておきます。
git init
git add .
git commit -m "first commit"

DBML作成
まずは基にするDBMLを作成します。
パッケージのREADMEにあるサンプルを貼り付けてみます。
▼「database/schema.dbml」
Table users {
id int [pk, increment]
name varchar
email varchar [unique]
password varchar
created_at datetime
updated_at datetime
}
Table posts {
id int [pk, increment]
user_id int [ref: > users.id]
title varchar
content text
created_at datetime
updated_at datetime
}
Ref: posts.user_id > users.id
DBMLを基にモデル生成
DBMLからmigrationファイルとmodelファイルを同時に生成します。
php artisan generate:dbml database/schema.dbml

既存の「app/Models/User.php」と「database/migrations/0001_01_01_000000_create_users_table.php」は上書きされませんでした。
どうやら「–force」オプションを付けて実行すると上書きされるようです。

▼「app/Models/Post.php」
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $fillable = [
'user_id',
'title',
'content'
];
protected $casts = [
'created_at' => 'datetime',
'updated_at' => 'datetime'
];
public function user()
{
return $this->belongsTo(User::class, 'user_id');
}
}
▼「database/migrations/2025_07_14_000000_create_posts_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()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained('users');
$table->string('title');
$table->text('content');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('posts');
}
};
なんだかインデントが気になりますが、
どうせ自動整形すんだろって感じですかね?
筆者的には、生成段階で何とかしろよって感じですが。
とりあえず、今回は以上です。
- 0
- 0
- 0
- 0


コメント