sehrgut/eloquent-computed-attributes

该软件包已被弃用且不再维护。没有建议的替代软件包。

当Laravel Eloquent模型输入更改时自动计算属性

0.0.2 2018-06-26 07:58 UTC

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) . '…';
    }
}

内部运作原理

  1. 通过定义 computeTextExcerptAttributeHasComputedAttributes 特性识别我们想要计算一个 text_excerpt 属性(遵循 访问器和变更器 的命名约定)
  2. 特性从方法签名中推导出计算属性的依赖项:如果 $this->text 发生更改($text 是方法签名的一部分),则需要重新计算 text_excerpt
  3. 在每个模型的 保存 事件中,如果任何计算属性的依赖项(方法的参数)已更改,则该方法将使用作为参数的更新值调用,并在调用模型的 save() 方法之前将其返回值分配给 $this->text_excerpt