alimfazeli / eloquence

此包最新版本(dev-master)没有提供许可证信息。

一套扩展,为 Laravel 的 Eloquent 库添加更多功能和一致性。

dev-master 2016-07-31 08:01 UTC

This package is not auto-updated.

Last update: 2024-09-20 20:26:21 UTC


README

Version Downloads Status

Eloquence 是一个扩展 Laravel 5 基础 Eloquent 模型和功能的包。

它提供了一系列工具和类,以新的和有用的方式与 Eloquent 一起工作,例如驼峰式属性(用于 JSON API)、计数缓存、UUID 等。

安装

通过 composer 安装此包

composer require kirkbushell/eloquence:~2.0

对于 Laravel 4,请安装 1.1.5 版本。请注意,这不再受支持,不会收到任何新功能,只提供安全更新。

composer require kirkbushell/eloquence:1.1.5

用法

首先,将 eloquence 服务提供者添加到您的 config/app.php 文件中

'Eloquence\EloquenceServiceProvider',

需要注意的是,这将自动重新绑定 Eloquent 用于多对多关系的 Model 类。这是必要的,因为在实例化 Pivot 模型时,我们需要它利用父模型的信息和可能需要的特性。

现在您应该可以开始使用模型了。

将所有事物转换为驼峰式!

对于我们这些喜欢在整个应用程序中保持单一编码标准的人,使用 CamelCaseModel 特性可以确保所有属性、关系和来自我们 Eloquent 模型的相关数据都以驼峰式方式持续到我们的 API 中。如果您正在编写前端应用程序,并且也使用 camelCase,这非常重要。这有助于我们应用程序的标准化。要使用

use Eloquence\Behaviours\CamelCasing;

将上述行放入您的模型中,这样就完成了。

注意!

Eloquence 不会改变您编写模式迁移的方式。您在设置数据库模式迁移中的字段和表时仍应使用 snake_case。这是一个好事 - 字段名的 snake_case 是 Laravel 社区中的默认标准 :)

UUIDs

Eloquence 内置了 UUID 功能,您可以在模型中使用。

只需包含 Uuid 特性

use Eloquence\Behaviours\Uuid;

然后禁用自动递增 id

public $incrementing = false;

这将关闭模型中的 id 自动递增,并自动为 id 字段生成 UUID4 值。一个好处是您实际上可以在记录保存之前就了解记录的 id!

您必须确保您的 id 列已设置以处理 UUID 值。这可以通过创建以下属性的迁移来实现

$table->char('id', $length = 36)->index();

需要注意的是,在使用 UUID 功能之前,您应该进行一些研究,并确定它是否适合您。UUID 字段搜索比索引整数字段(如自动递增 id 字段)慢得多。

自定义 UUIDs

如果您需要自定义 UUID 解决方案(例如,您可能不想使用 UUID4 id),您可以直接在 id 字段上定义所需的值。UUID 模型特性不会设置 id,如果它已经被定义。然而,在这种情况下,使用 Uuid 特性可能并不好,因为它在这种情况下实际上没有用。

行为

Eloquence 内置了一个用于设置行为(实际上是您可以与 Eloquent 模型一起使用的小型库)的系统。第一个就是计数缓存。

计数缓存

计数缓存是指缓存相关表记录计数的操作结果。一个简单的例子是,一个用户有多个帖子。在这个例子中,你可能想要统计一个用户有多少帖子,甚至按这个数量排序。在SQL中,按计数字段排序很慢,并且无法建立索引。你可以通过在用户记录上缓存用户创建的帖子数量来解决这个问题。

要使这工作,你需要进行两个步骤

  1. 在模型上使用Countable特质
  2. 配置计数缓存设置

配置计数缓存

为了设置计数缓存配置,我们需要让模型使用Countable特质,如下所示

class Post extends Eloquent {
    use Countable;
    
    public function countCaches() {
        return [User::class];
    }
}

这告诉计数缓存,Post模型在User模型上有一个计数缓存。因此,每当添加、修改或删除帖子时,计数缓存行为将更新相应用户帖子的计数缓存。在这种情况下,它将更新用户模型上的post_count

上面的例子使用了以下标准约定

  • post_count是User模型表上定义的字段
  • user_id是表示post模型外键的字段
  • id是用户模型表上的主键

然而,这些是可以配置的

class Post extends Eloquent {
    use Countable;
    
    public function countCaches() {
        return [
            'num_posts' => ['User', 'users_id', 'id']
        ];
    }
}

此示例使用num_postsusers_id分别自定义计数缓存字段和相关外键。

或者,你可以非常明确地配置(如果你在多个表上使用计数缓存并且每个表上使用相同的列名,这很有用)

class Post extends {
    use Countable;
    
    public function countCaches() {
        return [
            [
                'model'      => 'User',
                'field'      => 'num_posts',
                'foreignKey' => 'users_id',
                'key'        => 'id'
            ]
        ];
    }
}

如果使用显式配置,至少需要定义“model”参数。如果省略,“countField”,“foreignKey”和“key”参数将使用上面提到的标准约定进行计算。

现在配置好了这个配置 - 你可以开始了!

求和缓存

求和缓存与计数缓存类似,但不同之处在于,它缓存的是相关表记录中特定字段的总和,而不是记录的计数。一个简单的例子是,一个订单有多个项目。使用求和缓存,你可以缓存所有项目的价格总和,并将其存储在订单表中。

要使这工作——就像计数缓存一样——你需要进行两个步骤

  1. 在模型上使用Summable特质
  2. 为任何求和缓存配置模型

配置求和缓存

要设置求和缓存配置,只需执行以下操作

class Item extends Eloquent {
    use Summable;
    
    public function sumCaches() {
        return [Order::class];
    }
}

这告诉求和缓存管理器,Item模型在Order模型上有一个求和缓存。因此,每当添加、修改或删除项目时,求和缓存行为将更新相应订单的求和缓存。在这种情况下,它将更新Order模型上的item_total

上面的例子使用了以下约定

  • item_total是Order模型表上定义的字段
  • total是Item模型表上定义的字段(我们正在对其求和的列)
  • order_id是表示item模型外键的字段
  • id是订单模型表上的主键

然而,这些是可以配置的

class Item extends Eloquent {
    use Summable;
    
    public function sumCaches() {
        return [
            'item_total' => ['Order', 'total', 'order_id', 'id']
        ];
    }
}

或者使用详细语法

class Item extends Eloquent {
    use Summable;
    
    public function sumCaches() {
        return [
            [
                'model'       => 'Order',
                'columnToSum' => 'total',
                'field'       => 'item_total'
                'foreignKey'  => 'order_id',
                'key'         => 'id'
            ]
        ];
    }
}

这两个例子都实现了默认设置。

配置了这些设置后,你现在将看到每当添加、更新或删除项目时,相关模型的求和缓存都会更新。

可缩写的模型

Sluggable是另一种行为,它允许轻松添加模型缩写。要使用它,实现Sluggable特质

class User extends Eloquent {
    use Sluggable;

    public function slugStrategy() {
        return 'username';
    }
}

在上面的例子中,基于User模型的username字段创建缩写。然而,还有另外两个缩写也受到支持

  • id和
  • uuid

两个以上(的)唯一区别在于,如果您使用UUID,则会在保存之前根据uuid字段生成slug。对于通常使用自增策略的id,slug的生成要在记录保存之后进行,这会导致对数据库的二次保存调用。

就这么多!简单吧?

变更日志

2.0.3

  • Slugs现在实现了Jsonable,使它们在API响应中更容易处理
  • 新增了用于重建缓存的Artisan命令(beta版本,使用风险自负)

2.0.2

  • 更新PHP依赖至5.6+
  • CountCache和SumCache行为现在通过服务层支持

2.0.0

  • 添加了Sum cache模型行为
  • 行为启动现在通过Laravel trait启动完成
  • 简化所有行为及其使用
  • 更新了README/配置指南

1.4.0

  • 从模型检索的Slugs现在返回Slug值对象。

1.3.4

  • 对于id策略,生成了更多随机、更不可预测的slugs

1.3.3

  • 修复了通过模型属性无法访问关系的问题

1.3.2

  • Slugged行为
  • 修复了fillable属性的问题

1.3.1

  • 关系修复
  • 修复了fillable属性的问题
  • Count cache更新以修复更改关系的问题
  • 实现count cache观察器的小更新

1.3.0

  • 添加了Count cache模型行为
  • 修复了多对多关系的大小写问题
  • 修复了使用::create时的问题

1.2.0

  • Laravel 5支持
  • README更新

1.1.5

  • UUID模型trait现在支持自定义UUID(而不是只为您生成它们)

1.1.4

  • UUID修复

1.1.3

  • 在服务提供器上移除了模式绑定

1.1.2

  • 通过自定义蓝图移除了uuid列的创建

1.1.1

  • 修复了依赖项的问题

1.1.0

  • 添加了UUIDModel trait
  • 添加了CamelCaseModel trait
  • 模型类已更新以使用CamelCaseModel trait - 已弃用,仅提供向后兼容支持
  • Eloquence现在是自己的命名空间(重大变更)
  • EloquenceServiceProvider添加,如果您想自动重载基础模型,请使用此服务提供器(对于pivot模型的大小写是必需的)。

1.0.2

  • 关系现在支持camelCasing检索(感谢@linxgws)

1.0.1

  • 修复了依赖解析问题

1.0.0

  • 初始实现
  • 模型属性的camel casing现在对设置器和获取器都可用

许可

Laravel框架是开源软件,许可协议为MIT。