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