raahul/larryfour

此包的最新版本(v1.0.2)没有可用的许可证信息。

Laravel 4 的模型和迁移生成器

v1.0.2 2013-12-26 08:32 UTC

This package is not auto-updated.

Last update: 2024-09-23 14:49:28 UTC


README

Build Status

当前版本: 1.0.2(稳定版)

如果你还不熟悉,我之前发布了一个名为 Larry 的 Laravel 生成器。这个版本旨在与 Laravel 4 一起工作,同时支持新功能,如多态关系。

Larry Four 是从零开始为 Laravel 4 重写的。我们有一个更好的语法,它允许更大的灵活性和添加更多功能的空间。

概览

以下是 larry 的输入示例

User users; hm Post; mo Image imageable; btm Role;
    id increments
    timestamps
    username string 50; default "hello world"; nullable;
    password string 64
    email string 250
    type enum admin, moderator, user

Post; mm Image imageable;
    timestamps
    title string 250
    content text
    rating decimal 5 2

Image
    filename string

Role
    name string
    level integer

在上面的例子中,Larry 会做以下操作

  • 为所有所需的表创建迁移文件,包括所有列。Larry 会自动确定要根据你定义的关系添加哪些外键列。在 belongsToMany 关系的情况下,也会自动创建 Pivot 表。
  • 为所有定义的模型创建模型文件。这些模型也自动定义了关系函数。

安装

你可以访问Packagist 检查 Larry Four 的最新版本。目前,它是 1.0.2

以下是步骤

  • 在 composer.json 中添加以下内容:"raahul/larryfour": "1.*"
  • 运行 composer update
  • 'Raahul\LarryFour\LarryFourServiceProvider' 添加到 app/config/app.phpproviders 数组中

使用方法

一旦成功安装了 Larry Four,它的命令应该可以通过 artisan 访问。你可以始终输入 php artisan 来查看所有可用的命令,以及那些在 larry 命名空间下可用的命令。

Larry Four 支持 四个命令。

php artisan larry:generate <input_file>

上述命令接受 <input_file> 作为输入,并基于该输入生成模型和迁移。你必须提供一个存在于 Laravel 4 安装根目录中(其中 artisan 本身存在)的文件名。

目前,你不能为输入文件提供绝对路径。如果你提供的是相对路径而不是文件名,则它是相对于 Laravel 的根目录(或基本路径)。

还有两个其他命令

// Generate only migrations, not models
php artisan larry:migrations <input_file>

// Generate only models, not migrations
php artisan larry:models <input_file>

从现有表生成迁移

第四个命令略有不同,因为它允许你从现有表生成迁移。使用方法如下

php artisan larry:fromdb

默认情况下,它将选择数据库中的所有表(除了 Laravel 迁移表)。Larry Four 会始终显示将要处理的表列表,并要求你确认。

可以通过指定命令的 onlyexcept 选项来更改 Larry 处理的表。

// This will process only the tables 'users' and 'posts'
php artisan larry:fromdb --only=users,posts

// This will process all tables except users and posts
php artisan larry:fromdb --except=users,posts

在生成迁移之前,你将再次得到确认。

Larry Four 是智能的,它可以区分布尔值和其他 tinyint,以及增量值和正常无符号整数。

请注意,你的表需要有一个整数主键。如果没有找到,迁移将自动包含一个 id 字段。

语法参考

在 Laravel 安装根目录下创建一个新文本文件,你可以将其命名为任何你想要的名称。输入文件基本上定义以下内容

  • 应创建的所有模型
  • 这些模型之间的关系
  • 每个模型内的字段
  • 字段的修改器,如默认值、可为空/无符号和索引

所有模型都获得一个名为id的自动递增主键。您可以覆盖主键的名称。所有创建的外键都是无符号的。

Larry还提供了覆盖外键和枢轴表名称的方法。这些是可选的。默认情况下,Larry遵循与Laravel相同的命名约定,用于命名表、枢轴表和外键。

最后,Larry会忽略空白行(即使它们包含空白)。因此,您可以自由地美化您的输入。

现在,让我们从语法开始。

模型定义

模型定义是您告诉Larry需要创建的新模型的方式。由于字段需要添加到模型中,因此模型定义将是您输入文件的第一条逻辑行。

在定义新模型时,该行不应该以任何数量的空白缩进。

最简单的模型定义可能如下所示

User

所有模型都将自动获得一个类型为incrementsid字段。除了定义模型之外,您还可以在此行上定义模型之间的关系。

User users; hm Post; mo Image imageable; btm Role;

在上面的例子中,我们指定了用户与其他模型之间的关系。支持的关联类型包括

hm: hasMany
ho: hasOne
btm: belongToMany
btmc: belongsToMany with custom pivot table
mm: morphMany
mo: morphOne

请注意,您不能指定belongsTomorphTo关系。当在相关模型中指定它们的反关系hasMany, hasOne, morphMany, morphOne时,它们将自动添加到相关模型中。

有关带有自定义枢轴表的belongsToMany的说明,请参阅“创建孤儿表”部分。

分号

在定义相关模型时,每个定义都由分号分隔。最后的分号是可选的。

覆盖表名

您可以通过在模型名称后简单添加它来覆盖当前模型表的名称。

User my_users; hm Post

生成的模型和迁移将考虑这一点。

覆盖外键和枢轴表名称

在指定关系时,您可以覆盖使用的外键。可以这样做

User; hm Post my_user_id;

在上面的例子中,将使用外键my_user_id而不是传统的user_id。Larry会在迁移中处理命名,并在模型的关系函数中覆盖默认外键。

belongsToMany的情况下,您可以覆盖枢轴表名称

// pivot table will be named "r_u" instead of the
// conventional role_user
User; btm Role r_u;

以及枢轴表内的外键

// foreign keys are named "u_id" & "r_id" instead of
// the conventional "user_id" & "role_id"
User; btm Role r_u u_id r_id;

对于多态关系(morphOnemorphMany),必须为关系指定第二个参数,表示多态函数的名称

User; mm Image imageable;

字段定义

在定义模型之后,您需要为它定义字段。

User users; hm Post; mo Image imageable;
    id increments
    timestamps
    username string 50; default "hello world"; nullable;
    password string 64
    email string 250
    type enum admin, moderator, user
    softDeletes

从上面可以看到,您可以很好地了解字段是如何定义的。语法如下

<field_name> <field_type> <field_parameters>; <field_modifier>; <field_modifier> ...
  • <field_name>只是列名。
  • <field_type>是Laravel支持的任何字段类型。
  • <field_parameters>是字段函数的额外参数,如字符串的长度。
  • <field_modifier>包括默认、可为空、无符号和索引。可以为字段指定多个字段修饰符。

以下是一些需要注意的点

increments字段是可选的,您应该只有在不希望自动递增字段命名为id时才需要指定它。

timestampssoftDeletes字段是特殊的,因为它们没有字段名称。默认情况下,所有模型中的时间戳和软删除都是禁用的,迁移不会为它们创建列。通过将其中任何一个添加为字段,您将启用该模型的时间戳和软删除,并且迁移将包含必要的列。

enum字段具有不同的语法细微差别。枚举字段的参数由逗号分隔。它们可能或可能不单独用引号括起来,如下所示

type enum "admin", "moderator", "user"
OR
type enum admin, moderator, user

其他类型按预期工作,并且语法与上面的string类型类似。

以下字段类型是支持的

increments
string
integer
bigInteger
smallInteger
float
decimal
boolean
date
dateTime
time
timestamp (not to be confused with timestamp**s**)
text
binary
enum
softDeletes

以下字段修饰符是支持的

default "value"
nullable
unsigned
primary
fulltext
unique
index

创建孤儿表

现在,Larry 允许您创建表格(或精确的迁移),而不需要为该表格创建模型和关系。简而言之,这是一种快速添加表格的方法。

这个功能主要在创建针对 btmc 关系类型的自定义交叉表格时非常有用。交叉表格不与任何模型相关联。

通常,对于 btm 关系,系统会自动为您创建具有所需字段的交叉表格。然而,有时您可能希望在交叉表格中添加更多字段。在这种情况下,您应该使用 btmc 关系,然后指定一个包含所有所需列的定制表格。

例如

Post; mm Image imageable; btmc Comment;
    timestamps
    title string 250
    content text
    rating decimal 5 2

table comment_post
    comment_id integer; unsigned
    post_id integer; unsigned
    name string
    type string
    additional fields...

现在,文章与评论的多对多关系(不寻常)。Laravel 的约定规定,交叉表格应称为 comment_post,其中应包含 comment_idpost_id 字段。

您可以通过与 btm 一样的方式覆盖交叉表格名称和字段名称。只需确保您的定制表格反映了这一点即可。

如您所注意到的,使用 table <table_name> 术语定义定制表格。这是 Larry 区分您是想定义一个模型还是孤儿表的方式。

如果您指定了额外的字段,它们将被自动添加到模型关系的 withPivot 函数中

return $this->belongsToMany('Comment')->withPivot('name', 'type');

如果您的交叉表格包含时间戳,Larry 也会将它们添加到关系函数中

return $this->belongsToMany('Comment')->withPivot('name', 'type')->withTimestamps();

注意:如果您没有创建具有正确名称的交叉表格,或者交叉表格不包含 belongsToMany 关系所需的必要列,Larry 将抛出一个有用的错误。请记住,交叉表的外键必须是未签名的整数。

错误处理

Larry 四代有改进的错误处理机制。如果您的输入文件中有语法错误,您将收到关于它以及行号的提示。错误将以简单易懂的英语告诉您到底出了什么问题。

目前,Larry 可以检测以下错误

  • 关系类型中的拼写错误(将 hms 键入为 hm 将导致错误)
  • 关系或字段定义参数不足
  • 在另一个模型中指定为相关联的模型不存在
  • 无效的字段类型

测试

该存储库包含 PHPUnit 测试。这应该可以排除错误并加快功能发布。