sehrgut / eloquent-computed-attributes
该软件包已被弃用且不再维护。没有建议的替代软件包。
当Laravel Eloquent模型输入更改时自动计算属性
0.0.2
2018-06-26 07:58 UTC
Requires
- illuminate/support: ^5.4|^5.5|^5.6
Requires (Dev)
- phpunit/phpunit: ^7.2
This package is auto-updated.
Last update: 2023-03-14 01:15:41 UTC
README
当Laravel Eloquent模型输入更改时自动计算属性
计算属性 提供了 Laravel 内置 访问器 的替代方案。与访问器不同,计算属性 不是在请求值时计算,而是在其依赖项更改时计算(计算属性 在数据库中持久化)。在资源密集型计算的情况下应优先使用。
它通过监听模型的 保存
事件并检查 计算属性 的依赖项是否已更改来工作。如果是这样,则重新计算属性并更新数据库中的新值。
通过 "compute" 方法的签名声明 计算属性 的依赖项。该方法中的参数名称对应于模型上的属性。以下是如何实现的示例。
示例用例
- 将 markdown 字段渲染为 html
- 保存较长文本的摘要
- 更新时地址的地理编码
与其他选项的比较
方法 | 用例 | 计算时间 |
---|---|---|
Laravel 访问器 | 简单的转换(受 n+1 问题影响) | 在读取时 |
laravel-computed-properties | 在读取时应计算的可查询属性(避免 n+1 问题)。 | 在读取时 |
此软件包 | 耗时操作或涉及外部 API 调用的操作 | 在写入时 |
入门
1. 安装
composer require sehrgut/eloquent-computed-attributes
2. 定义一个 计算属性
假设我们有一个具有 text
列和 text_excerpt
列的 Post
模型。每次 text
的值更改时,我们希望重新计算 text_excerpt
列。我们的 Post
类可能看起来像这样
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use SehrGut\EloquentComputedAttributes\HasComputedAttributes; class Post extends Model { use HasComputedAttributes; /** @inheritDoc */ protected $fillable = ['title', 'text']; /** * Recompute the `text_excerpt` attribute when `text` changes. * * @param string $text * @return string */ public function computeTextExcerptAttribute(string $text): string { return substr($text, 0, 255) . '…'; } }
内部运作原理
- 通过定义
computeTextExcerptAttribute
,HasComputedAttributes
特性识别我们想要计算一个 text_excerpt 属性(遵循 访问器和变更器 的命名约定) - 特性从方法签名中推导出计算属性的依赖项:如果
$this->text
发生更改($text
是方法签名的一部分),则需要重新计算text_excerpt
- 在每个模型的
保存
事件中,如果任何计算属性的依赖项(方法的参数)已更改,则该方法将使用作为参数的更新值调用,并在调用模型的save()
方法之前将其返回值分配给$this->text_excerpt
。