verbanent / eloquent-binary-uuid
基于UUID版本1的Laravel / Eloquent有序二进制UUID
v1.8.1
2023-02-14 20:12 UTC
Requires
- php: ^7.3|^8
- ramsey/uuid: ^3.8|^4
Requires (Dev)
- laravel/framework: ^6.20.26|^7|^8|^9|^10
- mockery/mockery: ^1
- phpunit/phpunit: ^9
README
基于有关数据库中UUID存储优化的文章,我决定编写一个简单的库,允许我在项目中实现这一功能。我依据以下信息
https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/
https://www.percona.com/community-blog/2018/10/12/generating-identifiers-auto_increment-sequence/
该包目前仅支持MySQL。
安装
请通过Composer安装此包
composer require verbanent/eloquent-binary-uuid
迁移
如果你的模型使用有序二进制UUID,如果准备迁移
Schema::create('table_name', function (Blueprint $table) { $table->uuid('id'); });
或者如果你想为主键使用自定义列名
Schema::create('table_name', function (Blueprint $table) { $table->uuid('uuid'); $table->primary('uuid'); });
在模型中使用UUID
你只需在模型中使用具有UUID作为主键的新特性即可
use Illuminate\Database\Eloquent\Model; use Verbanent\Uuid\Traits\BinaryUuidSupportableTrait; class Book extends Model { use BinaryUuidSupportableTrait; }
上述示例适用于列id
。如果你为UUID列使用自定义名称,则需要定义它
use Illuminate\Database\Eloquent\Model; use Verbanent\Uuid\Traits\BinaryUuidSupportableTrait; class Book extends Model { use BinaryUuidSupportableTrait; public $uuidColumn = 'uuid'; }
具有UUID的模型的抽象模型
为了方便起见,你可以通过AbstractModel扩展你的模型
use Verbanent\Uuid\AbstractModel; class Lang extends AbstractModel { // }
上述示例适用于列id
。如果你为UUID列使用自定义名称,则需要定义它
use Verbanent\Uuid\AbstractModel; class Lang extends AbstractModel { public $uuidColumn = 'uuid'; protected $primaryKey = 'uuid'; protected $fillable = ['uuid']; }
外键二进制UUID
如果你想使用UUID作为外键,请使用另一个特性,并为此模型设置$uuidable属性
use Verbanent\Uuid\AbstractModel; use Verbanent\Uuid\Traits\ForeignBinaryUuidSupportableTrait; class LangTranslation extends AbstractModel { use ForeignBinaryUuidSupportableTrait; private $uuidable = [ 'lang', 'one_lang_bucket', ]; }
获取UUID的字符串形式
该库尽可能保持简单,因此如果你想要获取UUID的字符串形式,只需使用一个方法即可
$book = new \App\Book; $book->save(); dd($book->uuid()); // Output: "11e947f9-a1bd-f844-88d8-6030d483c5fe"
或者使用一个属性,如果你需要一个二进制值
# If you use the default primary key: dd($book->id); // Output: b"\x11éGù¡½øDˆØ`0ÔƒÅþ" # If you use `uuid` as a primary key: dd($book->uuid); // Output: b"\x11éGù¡½øDˆØ`0ÔƒÅþ"
通过主键UUID查找
对于主键,查找行很简单,并且总是返回一个模型
$lang = Lang::find('11e947f9-a1bd-f844-88d8-6030d483c5fe'); dd($lang->uuid()); // Output: "11e947f9-a1bd-f844-88d8-6030d483c5fe"
通过外键UUID查找
对于外键,查找行需要一个列名,并返回模型集合
$langTranslation = LangTranslation::findByUuid('lang', '11e947f9-a1bd-f844-88d8-6030d483c5fe'); dd($langTranslation[0]->uuid(), $langTranslation[1]->uuid(), $langTranslation[2]->uuid()); // Output: "11e94805-b94c-68e0-8720-6030d483c5fe" // "11e94805-b955-4e2e-b089-6030d483c5fe" // "11e94805-b957-af02-8bf8-6030d483c5fe"
获取外键UUID字符串
你可以打印外键UUID键的字符串形式
$translation = LangTranslation::findByUuid('lang', '11e947f9-a1bd-f844-88d8-6030d483c5fe')->first(); dd($translation->foreignUuid('lang')); // Output: "11e947f9-a1bd-f844-88d8-6030d483c5fe"
因为直接尝试访问属性将打印UUID的二进制形式
dd($translation->lang); // Output: b"\x11éGù¡½øDˆØ`0ÔƒÅþ"
单元测试
如果你想检查单元测试,请运行此命令
./vendor/bin/phpunit
或者如果你想检查代码覆盖率
phpdbg -qrr vendor/bin/phpunit --coverage-html coverage tests