verbanent/eloquent-binary-uuid

基于UUID版本1的Laravel / Eloquent有序二进制UUID

v1.8.1 2023-02-14 20:12 UTC

This package is auto-updated.

Last update: 2024-09-14 23:51:54 UTC


README

Quality Gate Status Downloads StyleCI CodeFactor Maintainability Rating Lines of Code Coverage Packagist PHP Version Support Packagist License

基于有关数据库中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