齿轮盒/eloquence

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

Eloquent 的身份映射实现

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

This package is auto-updated.

Last update: 2021-01-05 19:31:32 UTC


README

Latest Stable Version Latest Unstable Version License Scrutinizer Code Quality

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