【Laravel】1テキストファイルのデータベース定義のみでマイグレーションとモデルまで自動生成

 Laravelはとても人気のあるPHPフレームワークです。Laravelにはartisanというコマンドラインツールがあり、これの拡張が容易です。人気と相まって各々の作ったartisanコマンドには便利なものが多くあります。この記事ではlaravel-dacapoとeloquent-model-generatorを用いて1テキストファイルにまとまったデータベース定義からデータベースの初期化を行うマイグレーションコードとデータベースに対応したモデルコードを作ります。どちらのライブラリもcomposer requireで導入、管理できます。
 ucan-lab/laravel-dacapo: Laravel migration generator from schema.yml
 krlove/eloquent-model-generator: Eloquent Model Generator
 laravel-dacapoはデータベース定義を記述したymlファイルからデータベース初期化用のマイグレーションコードを生成するライブラリです。このライブラリを用いることによってデータベース定義が1テキストファイルで管理されることになり、開発段階でよくある複数人が同時にマイグレーションファイルを触ることによる定義の衝突が起こらなくなります。使い方はとてもシンプルでphp artisan dacapo:initで生成されるdatabase/schemas/default.ymlファイル中にデータベース定義を記述、定義を変えたらphp artisan dacapo:generate、php artisan migrate:freshするだけです。これで適切な順番でデータベースが初期化されます。ymlファイルの例は以下です。

users:
    relations: \
    - foreign: group_id
      references: id
      on: groups
      onUpdate: cascade
      onDelete: cascade
  columns:
    id: bigIncrements
    name: string
    email:
      type: string
      unique: true
    email_verified_at:
      type: timestamp
      nullable: true
    password: string
    rememberToken: true
    timestamps: true

 laravel-dacapoの発起人であるucan-lab氏は日本人でQiitaに自身の作成したライブラリ等の記事を投稿しています。詳しくは彼の記事を読むのが良いです。
Laravel × Dacapo で始める快適マイグレーション生活! – Qiita
 eloquent-model-generatorは現在のデータベースを元にEloquents(Laravelで使われるデータベースにマッピングされたモデル)ファイルを自動生成します。これを使うとよりわかりきったことを心を無にしてコピペ、改変する作業から解放されます。
 以前紹介した記事の様にテーブル名、モデル名を指定して自動生成します。

# モデル名を指定(テーブル名はモデル名の複数形)
php artisan krlove:generate:model User
# モデル名とテーブル名を指定
php artisan krlove:generate:model User --table-name=user

 【Laravel】Eloquent自動生成ライブラリeloquent-model-generatorの紹介 – 株式会社シーポイントラボ | 浜松のシステム開発会社
 テーブル名をコピペして正規表現で置換すると、それらしいコマンドが生成できるのでそれを使うと良いでしょう。

```
tags
task_tag
tasks
users
```
に対して
^(.*)$をphp artisan krlove:generate:model \1 --table-name=\1と置換して
```
php artisan krlove:generate:model tags --table-name=tags
php artisan krlove:generate:model task_tag --table-name=task_tag
php artisan krlove:generate:model tasks --table-name=tasks
php artisan krlove:generate:model users --table-name=users
```
複数形をざっくり消すためにs -を -と置換して
```
php artisan krlove:generate:model tag --table-name=tags
php artisan krlove:generate:model task_tag --table-name=task_tag
php artisan krlove:generate:model task --table-name=tasks
php artisan krlove:generate:model user --table-name=users
```
あとはCapsLockをオンにしてBackSpaceと適切なアルファベットキーを交互に連打
```
php artisan krlove:generate:model Tag --table-name=tags
php artisan krlove:generate:model Task_tag --table-name=task_tag
php artisan krlove:generate:model Task --table-name=tasks
php artisan krlove:generate:model User --table-name=users
```

 これでコマンドを走らせると外部キーを参考にしたリレーション、PHPDoc、fillableなどが埋められたモデルファイルが生成されます。
 上記二つのライブラリを組み合わせるとPHPのコードを一切触らないまま、プロジェクトに適したボイラープレートが作成されます。フローは次の様になります。

composer require ucan-lab/laravel-dacapo
composer require krlove/eloquent-model-generator
php artisan dacapo:init
// laravel-dacapo用形式のymlファイルを記述する。データベース設計もこのymlファイルと実データベースと実データベース参照便利ツールを元にすると記述が二度手間にならなくて楽。
php artisan dacapo:generate
php artisan migrate:fresh
// eloquent-model-generator用のコンフィグを用意
// コマンドを正規表現か何かで生成
php artisan krlove:generate:model Hoge --table-name=hoges
php artisan krlove:generate:model Fuga --table-name=fugas
>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG