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