カテゴリー
Linux

Laravel 5.5 既存のデータベースからモデルを一発で逆生成した手順

まとめ

バーション情報

  • Laravel Framework 5.5.45
  • Eloquent Model Generator 1.3.2

Eloquent Model Generator をインストールする

composer require krlove/eloquent-model-generator --dev

実際には次のようになり、注意点はまたしても同じです。

$ docker-compose run --rm composer require krlove/eloquent-model-generator --dev
Using version ^1.3 for krlove/eloquent-model-generator
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 5 installs, 0 updates, 0 removals
  - Installing krlove/code-generator (1.0.0): Downloading (100%)
  - Installing doctrine/event-manager (v1.0.0): Downloading (100%)
  - Installing doctrine/cache (v1.8.0): Downloading (100%)
  - Installing doctrine/dbal (v2.9.2): Downloading (100%)
  - Installing krlove/eloquent-model-generator (1.3.2): Downloading (100%)
doctrine/cache suggests installing alcaeus/mongo-php-adapter (Required to use legacy MongoDB driver)
Package phpunit/phpunit-mock-objects is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating optimized autoload files
*******************************************
 /!\ Warning, you're using a deprecated
 ¨¨¨ version of Carbon, we will soon stop
     providing support and update for 1.x
     versions, please upgrade to Carbon 2.
*******************************************

Most features of Carbon 1 are still available in Carbon 2.
See how to migrate: https://carbon.nesbot.com/docs/#api-carbon-2

Please consider upgrading your Laravel dependencies to be compatible with Carbon 2:
  - laravel/framework at least to version 5.8.0

If you can't update Laravel, check https://carbon.nesbot.com/ to see how to
install Carbon 2 using alias version and our adapter kylekatarnls/laravel-carbon-2

You can run './vendor/bin/upgrade-carbon' to get help in updating carbon and other frameworks and libraries that depend on it.
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: fideloper/proxy
Discovered Package: krlove/eloquent-model-generator
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Package manifest generated successfully.
$

Eloquent Model Generator の help

# php artisan help krlove:generate:model
Usage:
  krlove:generate:model [options] [--] <class-name>

Arguments:
  class-name                                Model class name

Options:
  -b, --backup                              Backup existing model
  -h, --help                                Display this help message
  -q, --quiet                               Do not output any message
  -V, --version                             Display this application version
      --ansi                                Force ANSI output
      --no-ansi                             Disable ANSI output
  -n, --no-interaction                      Do not ask any interactive question
      --env[=ENV]                           The environment the command should run under
  -tn, --table-name[=TABLE-NAME]            Name of the table to use
  -op, --output-path[=OUTPUT-PATH]          Directory to store generated model
  -ns, --namespace[=NAMESPACE]              Namespace of the model
  -bc, --base-class-name[=BASE-CLASS-NAME]  Model parent class
  -ts, --no-timestamps                      Set timestamps property to false
  -df, --date-format[=DATE-FORMAT]          dateFormat property
  -cn, --connection[=CONNECTION]            Connection property
  -v|vv|vvv, --verbose                      Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
#

Eloquent Model Generator を実際に動かす

Eloquent Model Generator には次のような機能があります。

  • 1 コマンドで 1 モデルを生成する。
  • モデル名を指定することができる。
  • 出力先のディレクトリ、 namespace を指定することができる。
    • コマンド実行時に出力先のディレクトリが無ければ生成される。
  • モデルの connection を指定することができる。
  • timestamps, dateFormat を指定することができる。
  • 出力されたファイルには、行末に余分なスペースがしばしば付いている。

次の内容で出力しました。

  • モデル名: 接頭辞である wp_ の後をモデル名とする。テーブル名が複数形の場合、モデル名は単数形にする。接頭辞の wp_ は Wp というディレクトリとして用意し、この中にモデルを入れていく。
  • 出力先のディレクトリ: --output-path=Models/Wp
  • namespace: --namespace=App\\Models\\Wp
  • タイムスタンプ: 12 のうち 7 つのテーブルに作成日時または更新日時のカラムが無いため、全てのモデルでこれらのカラムの自動更新を Eloquent にさせないように --no-timestamps を指定する。

これを踏まえて次のコマンドを用意しました。

php artisan krlove:generate:model Commentmeta --table-name=wp_commentmeta --output-path=Models/Wp --namespace=App\\Models\\Wp --no-timestamps
php artisan krlove:generate:model Comment --table-name=wp_comments --output-path=Models/Wp --namespace=App\\Models\\Wp --no-timestamps
php artisan krlove:generate:model Link --table-name=wp_links --output-path=Models/Wp --namespace=App\\Models\\Wp --no-timestamps
php artisan krlove:generate:model Option --table-name=wp_options --output-path=Models/Wp --namespace=App\\Models\\Wp --no-timestamps
php artisan krlove:generate:model Postmeta --table-name=wp_postmeta --output-path=Models/Wp --namespace=App\\Models\\Wp --no-timestamps
php artisan krlove:generate:model Post --table-name=wp_posts --output-path=Models/Wp --namespace=App\\Models\\Wp --no-timestamps
php artisan krlove:generate:model Term_relationship --table-name=wp_term_relationships --output-path=Models/Wp --namespace=App\\Models\\Wp --no-timestamps
php artisan krlove:generate:model Term_taxonomy --table-name=wp_term_taxonomy --output-path=Models/Wp --namespace=App\\Models\\Wp --no-timestamps
php artisan krlove:generate:model Termmeta --table-name=wp_termmeta --output-path=Models/Wp --namespace=App\\Models\\Wp --no-timestamps
php artisan krlove:generate:model Term --table-name=wp_terms --output-path=Models/Wp --namespace=App\\Models\\Wp --no-timestamps
php artisan krlove:generate:model Usermeta --table-name=wp_usermeta --output-path=Models/Wp --namespace=App\\Models\\Wp --no-timestamps
php artisan krlove:generate:model User --table-name=wp_users --output-path=Models/Wp --namespace=App\\Models\\Wp --no-timestamps

実際に行ったところ、次のようになりました。 1 番目のコマンドのみ抜粋します。

# php artisan krlove:generate:model Commentmeta --table-name=wp_commentmeta --output-path=Models/Wp --namespace=App\\Models\\Wp --no-timestamps
Model Commentmeta generated
#

生成されたモデルの中身

そして、出力されたモデルの app/Models/Wp/Commentmeta.php は次のようになりました。

<?php

namespace App\Models\Wp;

use Illuminate\Database\Eloquent\Model;

/**
 * @property integer $meta_id
 * @property integer $comment_id
 * @property string $meta_key
 * @property string $meta_value
 */
class Commentmeta extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'wp_commentmeta';

    /**
     * The primary key for the model.
     *
     * @var string
     */
    protected $primaryKey = 'meta_id';

    /**
     * The "type" of the auto-incrementing ID.
     *
     * @var string
     */
    protected $keyType = 'integer';

    /**
     * @var array
     */
    protected $fillable = ['comment_id', 'meta_key', 'meta_value'];

    /**
     * Indicates if the model should be timestamped.
     *
     * @var bool
     */
    public $timestamps = false;

}

おわりに

マイグレーションクラスやシーダークラスをファイルとして逆生成するかどうかは、議論の余地があると感じました。

けれども今回のデータベースからのモデルの逆生成は実際のアプリの製造で必ず使うこととなりますので、有用と思います。

その割には、日本語の情報を見つけられませんでした。

今回使用した krlove/eloquent-model-generator: Eloquent Model Generator は Laravel 5.8 にも対応しているようですので、データベースやテーブルの多い場合に威力を発揮すると思います。

以上です。

「Laravel 5.5 既存のデータベースからモデルを一発で逆生成した手順」への1件の返信

コメントを残す