jonathanguo/eloquent-model-generator

Eloquent模型生成器

2.0.15 2022-03-01 08:13 UTC

README

Eloquent模型生成器是一个基于Code Generator的工具,用于生成Eloquent模型。

  • 支持Laravel 5, 6, 7和8。
  • 使用barryvdh/laravel-ide-helper生成更好的DocBlock到模型中,这对开发者更加友好。
  • 自动生成castssoftDeletes特质。

为什么我又创建了一个生成器?

此包基于krlove/code-generator。维护者似乎不再回复GitHub上的任何消息。所以我镜像了仓库并进行了自定义修改以满足我的需求。

安装

步骤1. 将Eloquent模型生成器添加到您的项目中

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

步骤2. 注册GeneratorServiceProvider

'providers' => [
    // ...
    JonathanGuo\EloquentModelGenerator\Provider\GeneratorServiceProvider::class,
];

如果您使用的是Laravel版本5.5或更高版本,可以跳过此步骤,因为该项目支持包发现功能。

步骤3. 配置您的数据库连接。

用法

使用

php artisan generate:model User

php artisan generate:model User来生成一个模型类。生成器将查找名为users的表并为其生成一个模型。

table-name

使用table-name选项指定另一个表名

php artisan generate:model User --table-name=user

在这种情况下,生成的模型将包含protected $table = 'user'属性。

output-path

生成的文件将被保存到应用程序的app/Models目录中,并使用默认的App\Models命名空间。如果您想更改目的地和命名空间,请分别提供output-pathnamespace选项

php artisan generate:model User --output-path=/full/path/to/output/directory --namespace=Some\\Other\\NSpace

output-path可以是绝对路径,也可以是相对于项目app目录的相对路径。绝对路径必须以/开头

  • /var/www/html/app/Models - 绝对路径
  • Models - 相对路径,将被转换为/var/www/html/app/Models(假设您的项目app目录为/var/www/html/app

base-class-name

默认生成的类将扩展Illuminate\Database\Eloquent\Model。要更改基本类,请指定base-class-name选项

php artisan generate:model User --base-class-name=Some\\Other\\Base\\Model

备份现有模型

在生成新模型之前,请先保存现有模型

php artisan generate:model User --backup

如果User.php文件已存在,它将被重命名为User.php~并保存在同一目录中。然后,将生成新的User.php

其他选项

有几种有用的选项可以定义多个模型属性

  • no-timestamps - 向模型添加public $timestamps = false;属性
  • date-format - 指定模型的dateFormat属性
  • connection - 指定模型的连接名称属性

全局覆盖默认选项

您不必每次执行命令时都指定选项,可以创建一个名为eloquent_model_generator.php的配置文件,并将其放在项目的config目录中,包含您自己的默认值。生成器已经在其自己的配置文件Resources/config.php中包含了一些选项

<?php

return [
    'namespace'       => 'App',
    'base_class_name' => \Illuminate\Database\Eloquent\Model::class,
    'output_path'     => null,
    'no_timestamps'   => null,
    'date_format'     => null,
    'connection'      => null,
    'backup'          => null,
];

您可以通过在eloquent_model_generator.php中定义model_defaults数组来覆盖它们

<?php

return [
    'model_defaults' => [
        'namespace'       => 'Some\\Other\\Namespace',
        'base_class_name' => 'Some\\Other\\ClassName',
        'output_path'     => '/full/path/to/output/directory',
        'no_timestamps'   => true,
        'date_format'     => 'U',
        'connection'      => 'other-connection',
        'backup'          => true,
    ],
];

注册自定义数据库类型

如果在运行命令时出现错误

[Doctrine\DBAL\DBALException]
Unknown database type <ANY_TYPE> requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.

这意味着您必须使用Doctrine注册您的类型<ANY_TYPE>

例如,您打算注册 enum 类型并希望 Doctrine 将其视为 string(您可以在这里找到 Doctrine 所有现有的类型)。在您的 config/eloquent_model_generator.php 中添加以下几行

return [
    // ...
    'db_types' => [
        'enum' => 'string',
    ],
];

用法示例

user

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `email` varchar(100) NOT NULL,
  `role_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `role_id` (`role_id`),
  CONSTRAINT `user_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

命令

php artisan generate:model User  --table-name=user

结果

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

/**
 * @property int $id
 * @property int $role_id
 * @property mixed $username
 * @property mixed $email
 * @property Role $role
 * @property Article[] $articles
 * @property Comment[] $comments
 */
class User extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'user';

    /**
     * @var array
     */
    protected $fillable = ['role_id', 'username', 'email'];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function role()
    {
        return $this->belongsTo('Role');
    }

    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function articles()
    {
        return $this->hasMany('Article');
    }

    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function comments()
    {
        return $this->hasMany('Comment');
    }
}