krlove /eloquent-model-generator
Eloquent模型生成器
Requires
- php: ^8.0
- doctrine/dbal: ^3.0
- illuminate/config: ^9.0 || ^10.0
- illuminate/console: ^9.0 || ^10.0
- illuminate/database: ^9.0 || ^10.0
- illuminate/support: ^9.0 || ^10.0
- krlove/code-generator: ^1.0
Requires (Dev)
- phpunit/phpunit: ^9.5
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-path
和namespace
选项
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;