码云 / eloquence
一组扩展,为Laravel的Eloquent库添加额外功能和一致性。[仅为我项目修改]
Requires
- php: >=5.6.0
- hanneskod/classtools: ~1.0
- hashids/hashids: 1.0.5
- illuminate/database: ~5.1
- ramsey/uuid: ^3.3
Requires (Dev)
- illuminate/events: ~5.0
- mockery/mockery: 0.9.*@dev
- orchestra/testbench: 3.1.*
- phpunit/phpunit: 4.3.*
README
Eloquence是一个用于扩展Laravel 5的基础Eloquent模型和功能的包。
它提供了一些实用工具和类,以新的和有用的方式与Eloquent一起工作,例如驼峰式属性(用于JSON API)、计数缓存、UUID等。
安装
通过composer安装此包
composer require kirkbushell/eloquence:~2.0
对于Laravel 4,请安装1.1.5版本。请注意,这不再受支持,不会收到任何新功能,只有安全更新。
composer require kirkbushell/eloquence:1.1.5
使用
首先,将eloquence服务提供者添加到您的config/app.php文件中
'Eloquence\EloquenceServiceProvider',
请注意,这将自动重新绑定Eloquent使用的多对多关系的Model类。这是必要的,因为当Pivot模型被实例化时,我们需要它利用父模型的信息和可能需要的特性。
现在您应该可以使用您的模型了。
全部使用驼峰命名法!
对于那些喜欢在整个应用程序中使用单一编码标准的人来说,使用CamelCaseModel特性将确保所有来自Eloquent模型的属性、关系和关联数据都以驼峰命名法持久到我们的API中。如果您正在编写前端应用程序,这些应用程序也使用camelCase,这非常重要。这允许我们的应用程序有一个更好的标准。要使用
use \Eloquence\Behaviours\CamelCasing;
将上面的行放入您的模型中,就完成了。
注意!
Eloquence不会改变您编写schema迁移的方式。您仍然应该在数据库模式迁移中设置字段和表时使用snake_case。这是一个好事 - 字段名称的snake_case是Laravel社区中的默认标准 :)
UUIDs
Eloquence附带UUID功能,您可以在模型中使用这些功能。
只需包含Uuid特性
use Eloquence\Behaviours\Uuid;
然后禁用自动增加的id
public $incrementing = false;
这将关闭模型中的id自动增加,并自动为id字段生成一个UUID4值。一个好处是您实际上可以在记录保存之前知道记录的id!
您必须确保您的id列已设置以处理UUID值。这可以通过创建具有以下属性的迁移来完成
$table->char('id', $length = 36)->index();
请注意,在您使用UUID功能之前,您应该进行一些研究,看看它是否适合您。UUID字段搜索比索引整数字段(如自动增加的id字段)慢得多。
自定义UUIDs
如果您需要自定义UUID解决方案(即,可能您不想使用UUID4 id),您可以直接在id字段上定义所需的值。UUID模型特性不会设置id,如果它已经被定义。然而,在这种情况下,使用Uuid特性可能不是很好,因为在这种情况下它实际上是无用的。
行为
Eloquence附带一个用于设置行为(实际上是一些小库)的系统,您可以与Eloquent模型一起使用这些行为。其中第一个是计数缓存。
计数缓存
计数缓存是指缓存相关表记录的计数结果。一个简单的例子是,一个用户有很多帖子。在这个例子中,你可能想统计用户经常发的帖子数量——甚至按此排序。在SQL中,按计数字段排序很慢,并且无法建立索引。你可以通过在用户的记录中缓存用户创建的帖子数量来绕过这个问题。
要使此功能正常工作,你需要进行两个步骤
- 在模型上使用Countable特征
- 配置计数缓存设置
配置计数缓存
为了设置计数缓存配置,我们需要模型使用Countable特征,如下所示
class Post extends Eloquent { use Countable; public function countCaches() { return [User::class]; } }
这告诉计数缓存,Post模型在User模型上有一个计数缓存。因此,每当添加、修改或删除帖子时,计数缓存行为将更新相应用户的帖子计数缓存。在这种情况下,它将更新用户模型上的post_count
。
上面的例子使用了以下标准约定
post_count
是User模型表上定义的字段user_id
是代表Post模型外键的字段id
是User模型表上的主键
然而,这些都是可配置的
class Post extends Eloquent { use Countable; public function countCaches() { return [ 'num_posts' => ['User', 'users_id', 'id'] ]; } }
这个例子通过num_posts
和users_id
分别自定义了计数缓存字段和相关的外键。
或者,你可以非常明确地配置(如果你在多个表上使用计数缓存并且每个表使用相同的列名时很有用)
class Post extends { use Countable; public function countCaches() { return [ [ 'model' => 'User', 'field' => 'num_posts', 'foreignKey' => 'users_id', 'key' => 'id' ] ]; } }
如果使用显式配置,至少需要定义“model”参数。如果省略,“countField”,“foreignKey”和“key”参数将使用上面提到的标准约定进行计算。
现在配置好了这些设置——你就可以开始了!
总和缓存
总和缓存与计数缓存类似,不同之处在于,它缓存的是相关表记录的特定字段的总和,而不是计数。一个简单的例子是,一个订单有很多项目。使用总和缓存,你可以缓存所有项目的价格总和,并将其存储在订单表中。
要使此功能正常工作——就像计数缓存一样——你需要进行两个步骤
- 在模型上使用Summable特征
- 配置任何总和缓存
配置总和缓存
要设置总和缓存配置,只需执行以下操作
class Item extends Eloquent { use Summable; public function sumCaches() { return [Order::class]; } }
这告诉总和缓存管理器,Item模型在Order模型上有一个总和缓存。因此,每当添加、修改或删除项目时,总和缓存行为将更新相应订单的项目总和缓存。在这种情况下,它将更新Order模型上的item_total
。
上面的例子使用了以下约定
item_total
是Order模型表上定义的字段total
是Item模型表上定义的字段(我们正在求和的列)order_id
是代表Item模型外键的字段id
是Order模型表上的主键
然而,这些都是可配置的
class Item extends Eloquent { use Summable; public function sumCaches() { return [ 'item_total' => ['Order', 'total', 'order_id', 'id'] ]; } }
或者使用详细语法
class Item extends Eloquent { use Summable; public function sumCaches() { return [ [ 'model' => 'Order', 'columnToSum' => 'total', 'field' => 'item_total' 'foreignKey' => 'order_id', 'key' => 'id' ] ]; } }
这两个例子都实现了默认设置。
配置了这些设置后,你现在将看到每当添加、更新或删除项目时,相关模型的总和缓存都会更新。
可变长度的模型
Sluggable是另一种允许轻松添加模型短语的特性。要使用,实现Sluggable特征
class User extends Eloquent { use Sluggable; public function slugStrategy() { return 'username'; } }
在上面的例子中,根据User模型的username字段创建一个短句。然而,还有另外两个短语也受支持
- id和
- uuid
两个上面的区别仅仅在于,如果你使用UUID,则slug将在保存之前根据uuid字段生成。对于通常采用自增策略的id,则slug必须在记录保存后生成,这会导致对数据库的二次保存调用。
就这样!简单吧?
更新日志
2.0.3
- slug现在实现了Jsonable接口,使其在API响应中更容易处理
- 新增 artisan 命令用于重建缓存(beta版,自行承担风险使用)
2.0.2
- 已更新PHP依赖到5.6+
- CountCache和SumCache行为现在通过服务层支持
2.0.0
- 添加了Sum cache模型行为
- 行为现在通过Laravel trait启动
- 所有行为及其使用简化
- 更新了README/配置指南
1.4.0
- 从模型检索的slug现在返回Slug值对象。
1.3.4
- 对于id策略,slug更加随机,可预测性更少
1.3.3
- 修复了通过模型属性无法访问关系的问题
1.3.2
- Slugged行为
- 修复了fillable属性问题
1.3.1
- 关系修复
- 修复了fillable属性问题
- 修复了更改关系时的Count cache更新问题
- 实现count cache观察器的小更新
1.3.0
- 添加了Count cache模型行为
- 修复了多对多关系的大小写问题
- 修复了使用 ::create 的问题
1.2.0
- Laravel 5支持
- README更新
1.1.5
- UUID模型trait现在支持自定义UUID(而不是仅为您生成UUID)
1.1.4
- UUID修复
1.1.3
- 在服务提供者上移除了schema绑定
1.1.2
- 通过自定义blueprint移除了uuid列的创建
1.1.1
- 修复了依赖问题
1.1.0
- 添加了UUIDModel trait
- 添加了CamelCaseModel trait
- 模型类更新为使用CamelCaseModel trait - 已弃用,仅提供向后兼容支持
- Eloquence现在有自己的命名空间(破坏性变更)
- EloquenceServiceProvider已添加,如果您想自动覆盖基本模型,请使用此服务提供者(对于pivot模型的大小写是必需的)。
1.0.2
- 关系现在支持用于检索的camelCasing(感谢@linxgws)
1.0.1
- 修复了依赖解析问题
1.0.0
- 初始实现
- 模型属性的camel casing现在可用于设置器和获取器
许可协议
Laravel框架是开源软件,许可协议为MIT。