该软件包的最新版本(v1.0.2)没有提供许可证信息。

Laravel 5 的模型和迁移生成器

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

README

Build Status

当前版本: 1.0.2 (稳定)

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

Larry 四是为 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 四的最新版本。目前,它是 1.0.2

以下是步骤

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

使用方法

成功安装 Larry 四后,您可以通过 artisan 访问其命令。您始终可以输入 php artisan 来查看所有可用的命令,以及那些在 larry 命名空间下的命令。

Larry 四支持 四个命令。

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 四将始终显示要处理的表列表,并要求您确认。

可以通过指定命令的 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 四非常智能,它可以区分布尔值和其他 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 测试。这应该可以排除错误,并加快功能发布。