krlove/eloquent-model-generator

Eloquent模型生成器

2.0.2 2023-11-25 16:32 UTC

This package is auto-updated.

Last update: 2024-09-13 10:48:47 UTC


README

Eloquent模型生成器使用数据库模式作为源来生成Eloquent模型。

版本2.0.0

版本2.0.0已发布。查看此讨论了解更多详情和升级说明。

安装

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

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

步骤2. 注册GeneratorServiceProvider

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

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

用法

使用

php artisan krlove:generate:model User

来生成模型类。生成器将查找名为users的表并为其生成模型。

表名

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

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

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

输出路径

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

php artisan krlove:generate:model User --output-path=/full/path/to/output/directory --namespace=Your\\Custom\\Models\\Place

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

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

基本类名称

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

php artisan krlove:generate:model User --base-class-name=Custom\\Base\\Model

无备份

如果User.php文件已存在,它将被重命名为User.php~并保存在同一目录中。除非指定了no-backup选项

php artisan krlove:generate:model User --no-backup

其他选项

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

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

覆盖默认选项

您可以在每次执行命令时指定选项,而不是创建一个名为eloquent_model_generator.php的配置文件,并将其放在项目的config目录中,以使用您自己的默认值

<?php

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

注册自定义数据库类型

如果运行命令导致错误

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

这意味着您必须在您的config/eloquent_model_generator.php中注册您的类型<TYPE>

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

用法示例

user

CREATE TABLE `users` (
  `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 `roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

命令

php artisan krlove:generate:model 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
{
    /**
     * @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');
    }
}

为所有表生成模型

krlove:generate:models命令将生成数据库中所有表的模型。它接受所有适用于krlove:generate:model的选项,以及skip-table选项。

跳过表

指定一个或多个要跳过的表名

php artisan krlove:generate:models --skip-table=users --skip-table=roles

注意,如果您已配置前缀,则必须指定不带前缀的表名。

自定义

您可以通过添加自己的Krlove\EloquentModelGenerator\Processor\ProcessorInterface实例并使用GeneratorServiceProvider::PROCESSOR_TAG对其进行标记来挂钩到模型生成过程。

假设您想覆盖Eloquent的perPage属性值。

class PerPageProcessor implements ProcessorInterface
{
    public function process(EloquentModel $model, Config $config): void
    {
        $propertyModel = new PropertyModel('perPage', 'protected', 20);
        $dockBlockModel = new DocBlockModel('The number of models to return for pagination.', '', '@var int');
        $propertyModel->setDocBlock($dockBlockModel);
        $model->addProperty($propertyModel);
    }

    public function getPriority(): int
    {
        return 8;
    }
}

getPriority确定处理器相对于其他处理器的调用顺序。

在您的服务提供者中

public function register()
{
    $this->app->tag([InflectorRulesProcessor::class], [GeneratorServiceProvider::PROCESSOR_TAG]);
}

之后,生成的模型将包含以下代码

/**
 * The number of models to return for pagination.
 * 
 * @var int
 */
protected $perPage = 20;