齿轮盒 / eloquence
Requires
- php: ^7.4 | ^8.0
- laravel/framework: ^7 || ^8
This package is auto-updated.
Last update: 2021-01-05 19:31:32 UTC
README
- Laravel: 7+
- PHP: 7.4+
- 许可证: MIT
- 作者: Ollie Read
- 作者主页: https://sprocketbox.io
Eloquent identity 在 Eloquent 上提供缓存,防止使用身份映射设计模式(P of EAA & 维基百科)为单个数据库行创建多个模型。
目录
安装
要安装此包,请运行以下命令。
composer require sprocketbox/eloquent-identity
此包使用自动发现来注册服务提供者,但如果您想手动完成,服务提供者是
Sprocketbox\Eloquent\Identity\ServiceProvider
无需配置。
用法
要使用 Eloquent 身份映射,请为您的模型添加以下特质。
Sprocketbox\Eloquent\Identity\Concerns\MapsIdentity
查找
对于使用此特质且已通过提供 id 创建模型的模型上的任何对 find()
、findOrFail()
或 findOrNew()
的调用,都会跳过查询。
对 findMany()
的调用将跳过任何已使用的 ids,只查询缓存中不存在的 ids。
仅在没有 where 子句、连接或 having 语句的情况下跳过查询。
如果您想强制查询,可以在查询构建器实例上调用 refreshIdentityMap()
。如果您想在已调用 refreshIdentityMap()
的构建器实例上跳过查询,可以调用 useIdentityMap()
。
填充
当查询构建器尝试使用此特质创建与模型中已存在的实例匹配的新实例时,将使用现有实例。
如果模型使用时间戳,并且返回的属性较新,则现有实例上的属性将更新,但会保留您之前所做的任何更改。
属于
如果没有约束并且未调用 refreshIdentityMap()
,则加载属于关系(非属于多个)的查询将跳过任何已存在的模型实例。
刷新
如果您想刷新缓存中的模型,可以在 IdentityManager
实例或 Identity
门面实例上调用 flushIdentities()
。
如何
IdentityManager
存储了一个包含所有现有模型实例及其身份的数组。
模型的身份以字符串形式存储,使用以下类创建。
Sprocketbox\Eloquent\Identity\ModelIdentity
它包含一个键,模型类名称和连接名称。这些字符串版本看起来像这样
connection:class:key
为什么
很容易出现多个相同模型的版本,这意味着对一个模型的更新不会持久化到其他模型。
Eloquent 身份旨在减少创建的模型数量,帮助限制不必要的查询,并允许对模型进行一致的操作。无论你在代码的哪个位置处理用户 1,在请求期间所做的任何更改都将持久化到所有实例。