jonathanguo / eloquent-model-generator
Eloquent模型生成器
Requires
- barryvdh/laravel-ide-helper: ^2.6
- doctrine/dbal: ^3.1
- illuminate/database: ^5.0 | ^6.20.26 | ^7.0 | ^8.0 | ^9.0
- illuminate/support: ^5.0 | ^6.0 | ^7.0 | ^8.0 | ^9.0
- jonathanguo/code-generator: ^1.0
README
Eloquent模型生成器是一个基于Code Generator的工具,用于生成Eloquent模型。
- 支持Laravel 5, 6, 7和8。
- 使用barryvdh/laravel-ide-helper生成更好的DocBlock到模型中,这对开发者更加友好。
- 自动生成
casts
和softDeletes
特质。
为什么我又创建了一个生成器?
此包基于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-path
和namespace
选项
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'); } }