alimfazeli / 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.*
This package is not auto-updated.
Last update: 2024-09-20 20:26:21 UTC
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 不会改变您编写模式迁移的方式。您在设置数据库模式迁移中的字段和表时仍应使用 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
是用户模型表上的主键
然而,这些是可以配置的
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
是订单模型表上的主键
然而,这些是可以配置的
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,则会在保存之前根据uuid字段生成slug。对于通常使用自增策略的id,slug的生成要在记录保存之后进行,这会导致对数据库的二次保存调用。
就这么多!简单吧?
变更日志
2.0.3
- Slugs现在实现了Jsonable,使它们在API响应中更容易处理
- 新增了用于重建缓存的Artisan命令(beta版本,使用风险自负)
2.0.2
- 更新PHP依赖至5.6+
- CountCache和SumCache行为现在通过服务层支持
2.0.0
- 添加了Sum cache模型行为
- 行为启动现在通过Laravel trait启动完成
- 简化所有行为及其使用
- 更新了README/配置指南
1.4.0
- 从模型检索的Slugs现在返回Slug值对象。
1.3.4
- 对于id策略,生成了更多随机、更不可预测的slugs
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(而不是只为您生成它们)
1.1.4
- UUID修复
1.1.3
- 在服务提供器上移除了模式绑定
1.1.2
- 通过自定义蓝图移除了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。