bethinkpl/laravel-model-uuid

此包允许您轻松地在Laravel模型中处理UUID。

v1.0.0 2023-01-27 10:47 UTC

This package is not auto-updated.

Last update: 2024-09-21 18:36:48 UTC


README

Build Status Scrutinizer Code Quality Code Coverage Latest Stable Version Total Downloads License Dependency Status Buy us a tree

介绍

最近我发现自己需要在多个项目中使用UUID,所以我将这个功能打包起来,而不是在每个项目中复制粘贴。

注意:此包明确不禁止Eloquent模型上的自增。在数据库索引方面,通常使用自增整数进行内部查询更有效率。对uuid列进行索引可以使该列的查找更快,而不会影响相关模型之间的查询。

有关更多信息,请查看这篇文章,其中介绍了如何以优化的方式存储和使用UUID。

如果您想轻松生成将UUID高效存储到数据库中的迁移,请查看laravel-efficient-uuid

如果您需要与ramsey/uuid >= 4.1兼容,请使用此包的>= 6.2.0版本。

从版本6.2.0开始,此包支持UUID版本1(uuid1)、4(uuid4)、6(uuid6 - 有序)和有序Laravel的有序UUID v4)。

代码示例

为了使用此包,您只需在Eloquent模型中导入并使用该特性即可。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Dyrynda\Database\Support\GeneratesUuid;

class Post extends Model
{
    use GeneratesUuid;
}

假设您已经在数据库中有一个名为uuid的字段,用于存储生成的值。如果您想使用自定义列名,例如,如果要将主id列设置为UUID,您可以在模型中定义一个uuidColumn方法。

class Post extends Model
{
    public function uuidColumn(): string
    {
        return 'custom_column';
    }
}

您可以在每个表中指定多个UUID列,通过在uuidColumns方法中指定一个数组。当使用whereUuid作用域查询时,将使用由uuidColumn指定的默认列。

class Post extends Model
{
    public function uuidColumns(): array
    {
        return ['uuid', 'custom_column'];
    }
}

默认情况下,此包将使用UUID版本4的值,但是,您也可以通过在模型中指定受保护的属性$uuidVersion来使用uuid1uuid4uuid6。如果您想利用在Laravel 5.6中引入的有序UUID(版本4)值,应在模型中将$uuidVersion指定为ordered

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Dyrynda\Database\Support\GeneratesUuid;

class Post extends Model
{
    use GeneratesUuid;

    protected $uuidVersion = 'uuid5';
}

虽然不建议,但如果您确实选择将UUID用作主模型键(id),请确保正确配置模型以进行此设置。不更新这些属性将导致Laravel尝试将您的id列转换为整数,这将转换为0。当与laravel-efficient-uuid结合使用时,此转换将导致抛出Ramsey\Uuid\Exception\InvalidUuidStringException异常。

<?php

namespace App;

use Dyrynda\Database\Support\GeneratesUuid;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use GeneratesUuid;

    public $incrementing = false;

    protected $keyType = 'string';
}

此特性还提供了一个查询作用域,允许您根据UUID轻松查找记录,并尊重您选择的任何自定义字段名。

// Find a specific post with the default (uuid) column name
$post = Post::whereUuid($uuid)->first();

// Find multiple posts with the default (uuid) column name
$post = Post::whereUuid([$first, $second])->get();

// Find a specific post with a custom column name
$post = Post::whereUuid($uuid, 'custom_column')->first();

// Find multiple posts with a custom column name
$post = Post::whereUuid([$first, $second], 'custom_column')->get();

如果您使用推荐的 laravel-efficient-uuid 包,则需要将类型转换添加到您的模型中,以正确设置和检索您的 UUID 值。这将确保您的 UUID 以二进制形式写入您的(MySQL)数据库,并以字符串形式显示。

<?php

namespace App;

use Dyrynda\Database\Casts\EfficientUuid;
use Dyrynda\Database\Support\GeneratesUuid;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use GeneratesUuid;

    protected $casts = [
        'uuid' => EfficientUuid::class,
    ];
}

路由模型绑定

从 6.5.0 版本开始,如果您想利用对 uuid 字段的隐式路由模型绑定,可以使用 BindsOnUuid 特性,它将默认使用配置的 uuidColumn

<?php

namespace App;

use Dyrynda\Database\Support\BindsOnUuid;
use Dyrynda\Database\Support\GeneratesUuid;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use BindsOnUuid, GeneratesUuid;
}

如果您需要额外的绑定控制,或者使用的是 < 6.5.0 的此包版本,您可以直接重写 getRouteKeyName 方法。

public function getRouteKeyName(): string
{
    return 'uuid';
}

如果您使用的是 laravel-efficient-uuid 包,隐式路由模型绑定默认不会工作。

Laravel 将使用 uuid 字段的字符串表示形式执行查询,以查询存储在数据库中的二进制数据。在这种情况下,您需要在您的 RouteServiceProvider 中显式使用包含的作用域来绑定参数。

// app/Providers/RouteServiceProvider.php

public function boot()
{
    Route::bind('post', function ($post) {
        return \App\Post::whereUuid($post)->first();
    });
}

安装

此包通过 Composer 安装。要安装,请运行以下命令。

composer require dyrynda/laravel-model-uuid

支持

如果您对此包有一般性问题,请随时通过 Twitter 联系我。

如果您认为您发现了一个问题,请使用 GitHub 问题跟踪器 报告它,或者更好的是,分支存储库并提交一个拉取请求。

如果您在使用此包,我很乐意听听您的想法。谢谢!

实物赠品

您可以使用此包,但如果它进入您的生产环境,您需要购买一棵树。

众所周知,应对气候危机并防止气温上升超过 1.5C 的最佳工具之一是种树。如果您支持此包并为实物赠品森林做出贡献,您将为当地家庭创造就业机会并恢复野生动物栖息地。

您可以在 这里 购买树木。

treeware.earth 上了解更多关于实物赠品的信息