rorecek/laravel-ulid

Laravel 包用于生成 ULID(通用唯一字母顺序排序标识符)

v2.0.6 2023-06-25 07:41 UTC

This package is auto-updated.

Last update: 2024-08-25 10:12:44 UTC


README

Laravel 包用于生成 ULID(通用唯一字母顺序排序标识符),还包含为您的模型自动生成 ULID id 的 trait。基于 robinvdvleuten/php-ulid

什么是 ULID?

在许多情况下,通用唯一标识符(UUID)对于许多用例可能不是最佳选择,因为

  • 它不是编码 128 位随机性的最高字符效率的方式
  • UUID v1/v2 在许多环境中不切实际,因为它需要访问唯一的、稳定的 MAC 地址
  • UUID v3/v5 需要唯一的种子,并生成随机分布的 ID,这可能导致许多数据结构碎片化
  • UUID v4 仅提供随机性信息,这可能导致许多数据结构碎片化

因此,ULID 提供了

  • 与 UUID 兼容的 128 位
  • 每毫秒 1.21e+24 个独特的 ULID
  • 字母顺序可排序!
  • 规范编码为 26 个字符的字符串,而不是 36 个字符的 UUID
  • 使用 Crockford 的 base32 以提高效率和可读性(每个字符 5 位)
  • 不区分大小写
  • 没有特殊字符(URL 安全)

您可以在 这里 了解更多

优点是什么?

  1. 在分布式系统中,您可以相当确信主键永远不会冲突。

  2. 在构建大型应用程序时,自动递增主键不是最佳选择。

  3. 它使复制变得简单(与 int 相比,这使它变得非常困难)

  4. 足够安全,不会让用户知道您正在通过 id 获取信息,例如 https://example.com/item/10

安装

您可以使用以下命令通过 composer 安装此包

 composer require rorecek/laravel-ulid:^2.0

Laravel 5.5+

无需执行其他操作,因为服务提供者和外观将被自动发现。

Laravel 5.3 和 5.4

您必须安装服务提供者和外观

// config/app.php
'providers' => [
    ...
    Rorecek\Ulid\UlidServiceProvider::class,
];

...

'aliases' => [
    ...
    'Ulid' => Rorecek\Ulid\Facades\Ulid::class,
];

使用方法

迁移

当使用迁移时,应将 $table->increments('id') 更改为

$table->char('id', 26)->primary();

简单地,模式看起来像这样。

Schema::create('items', function (Blueprint $table) {
  $table->char('id', 26)->primary();
  ....
  ....
  $table->timestamps();
});

如果相关的模型使用 ULID,则列类型也应反映这一点。

Schema::create('items', function (Blueprint $table) {
  $table->char('id', 26)->primary();
  ....
  // related model that uses ULID
  $table->char('category_id', 26);
  $table->foreign('category_id')->references('id')->on('categories');
  ....
  $table->timestamps();
});

模型

要设置模型以使用 ULID,只需使用 HasUlid trait。

use Illuminate\Database\Eloquent\Model;
use Rorecek\Ulid\HasUlid;

class Item extends Model
{
  use HasUlid;
}

控制器

当您创建使用 ULID 的模型的新实例时,此包将自动将 ULID 添加为模型的 id。

// 'HasUlid' trait will automatically generate and assign id field.
$item = Item::create(['name' => 'Awesome item']);
echo $item->id;
// 01brh9q9amqp7mt7xqqb6b5k58

支持

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

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

许可

MIT 许可证 (MIT)。 Pavel Rorecek