【Laravel12】DBML to Laravel Eloquent Generatorを使ってみた

Laravel

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

Generate Eloquent Models from Database Markup Language Files - Laravel News
Generate Eloquent models and migration files directly from DBML diagrams with fillable properties, defined relationships...
GitHub - egyjs/dbml-to-laravel: Laravel package to generate Eloquent models and migration files from DBML schema files. Simplify DBML parsing, automate relationship creation, and speed up your development workflow.
Laravel package to generate Eloquent models and migration files from DBML schema files. Simplify DBML parsing, automate ...

前提条件

  • 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

コメント

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