sprocketbox/eloquent-identity

此包已被弃用且不再维护。作者建议使用 olliecodes/eloquent-identity 包。

Eloquent 的身份映射实现

v1.2.0 2021-01-05 19:30 UTC

This package is auto-updated.

Last update: 2021-11-18 12:36:39 UTC


README

Latest Stable Version Latest Unstable Version License Scrutinizer Code Quality

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,在请求期间所做的任何更改都将持久化到所有实例。