bethinkpl / laravel-model-uuid
此包允许您轻松地在Laravel模型中处理UUID。
Requires
- php: ^7.3|^8.0
- illuminate/database: ^8.12|^9.0
- illuminate/events: ^8.12|^9.0
- illuminate/support: ^8.12|^9.0
- ramsey/uuid: ^4.7
Requires (Dev)
- dyrynda/laravel-efficient-uuid: ^4.5.2
- laravel/legacy-factories: ^1.0.4
- orchestra/testbench: ^6.0|^7.0
- phpunit/phpunit: ^9.3
Suggests
- dyrynda/laravel-efficient-uuid: Override Laravel's default query grammar to efficiently store UUIDs.
This package is not auto-updated.
Last update: 2024-09-21 18:36:48 UTC
README
介绍
最近我发现自己需要在多个项目中使用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
来使用uuid1
、uuid4
或uuid6
。如果您想利用在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 上了解更多关于实物赠品的信息