品牌导向/uuid-doctrine

允许将 ramsey/uuid 作为 Doctrine 字段类型使用。

1.6.1 2020-11-19 06:46 UTC

This package is auto-updated.

Last update: 2024-09-19 14:49:52 UTC


README

Source Code Latest Version Software License Build Status Coverage Status Total Downloads

ramsey/uuid-doctrine 包提供了将 ramsey/uuid 作为 Doctrine 字段类型使用的功能。

本项目遵守贡献者行为准则。参与本项目及其社区,您应遵守此准则。

安装

推荐的安装方法是通过 PackagistComposer。运行以下命令安装包并将其添加到项目的 composer.json

composer require ramsey/uuid-doctrine

示例

配置

要配置 Doctrine 以使用 ramsey/uuid 作为字段类型,您需要在您的 bootstrap 中设置以下内容

\Doctrine\DBAL\Types\Type::addType('uuid', 'Ramsey\Uuid\Doctrine\UuidType');

Symfony

# config/packages/doctrine.yaml
doctrine:
    dbal:
        types:
            uuid: Ramsey\Uuid\Doctrine\UuidType

Zend Framework

<?php
// module.config.php
use Ramsey\Uuid\Doctrine\UuidType;

return [
    'doctrine' => [
        'configuration' => [
            'orm_default' => [
                'types' => [
                    UuidType::NAME => UuidType::class,

使用

然后,在您的模型中,您可以通过将 @Column 类型设置为 uuid 并定义 Ramsey\Uuid\UuidGenerator 的自定义生成器来注解属性。Doctrine 将处理其余部分。

use Doctrine\ORM\Mapping as ORM;
use Ramsey\Uuid\Doctrine\UuidGenerator;

/**
 * @ORM\Entity
 * @ORM\Table(name="products")
 */
class Product
{
    /**
     * @var \Ramsey\Uuid\UuidInterface
     *
     * @ORM\Id
     * @ORM\Column(type="uuid", unique=true)
     * @ORM\GeneratedValue(strategy="CUSTOM")
     * @ORM\CustomIdGenerator(class=UuidGenerator::class)
     */
    protected $id;

    public function getId()
    {
        return $this->id;
    }
}

如果您使用 XML 映射而不是 PHP 注解。

<id name="id" column="id" type="uuid">
    <generator strategy="CUSTOM"/>
    <custom-id-generator class="Ramsey\Uuid\Doctrine\UuidGenerator"/>
</id>

您还可以使用 YAML 映射。

id:
    id:
        type: uuid
        generator:
            strategy: CUSTOM
        customIdGenerator:
            class: Ramsey\Uuid\Doctrine\UuidGenerator

二进制数据库列

在上一个示例中,Doctrine 将创建一个类型为 CHAR(36) 的数据库列,但您也可以使用此库将 UUID 存储为二进制字符串。`UuidBinaryType` 帮助实现这一点。

在您的 bootstrap 中放置以下内容

\Doctrine\DBAL\Types\Type::addType('uuid_binary', 'Ramsey\Uuid\Doctrine\UuidBinaryType');
$entityManager->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('uuid_binary', 'binary');

Symfony

# config/packages/doctrine.yaml
doctrine:
    dbal:
        types:
            uuid_binary:  Ramsey\Uuid\Doctrine\UuidBinaryType
        mapping_types:
            uuid_binary: binary

然后,在注解模型类属性时,使用 uuid_binary 而不是 uuid

@Column(type="uuid_binary")

InnoDB 优化的二进制 UUID

如果您想将 UUID 作为主键使用,则更合适。请注意,这可能会在以下情况下产生意外的效果:

  • 解码未使用此方法生成的字节
  • 另一个代码(不了解此方法)尝试解码生成的字节

更多信息请参阅此 Percona 文章Ben Ramsey 的 UUID 演讲(从 第 58 页 开始)。

\Doctrine\DBAL\Types\Type::addType('uuid_binary_ordered_time', 'Ramsey\Uuid\Doctrine\UuidBinaryOrderedTimeType');
$entityManager->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('uuid_binary_ordered_time', 'binary');

Symfony

# config/packages/doctrine.yaml
doctrine:
   dbal:
       types:
           uuid_binary_ordered_time: Ramsey\Uuid\Doctrine\UuidBinaryOrderedTimeType
       mapping_types:
           uuid_binary_ordered_time: binary

然后,在您的模型中,您可以注解属性,将 @Column 类型设置为 uuid_binary_ordered_time,并定义 Ramsey\Uuid\UuidOrderedTimeGenerator 的自定义生成器。Doctrine 将处理其余部分。

/**
 * @Entity
 * @Table(name="products")
 */
class Product
{
    /**
     * @var \Ramsey\Uuid\UuidInterface
     *
     * @Id
     * @Column(type="uuid_binary_ordered_time", unique=true)
     * @GeneratedValue(strategy="CUSTOM")
     * @CustomIdGenerator(class="Ramsey\Uuid\Doctrine\UuidOrderedTimeGenerator")
     */
    protected $id;

    public function getId()
    {
        return $this->id;
    }
}

如果您使用 XML 映射而不是 PHP 注解。

<id name="id" column="id" type="uuid_binary_ordered_time">
    <generator strategy="CUSTOM"/>
    <custom-id-generator class="Ramsey\Uuid\Doctrine\UuidOrderedTimeGenerator"/>
</id>

您可以使用以下两个函数在 mysql 命令行界面中使用此格式

CREATE
  FUNCTION `uuid_to_ouuid`(uuid VARCHAR(36))
  RETURNS BINARY(16) DETERMINISTIC
  RETURN UNHEX(CONCAT(
  SUBSTR(uuid, 15, 4),
  SUBSTR(uuid, 10, 4),
  SUBSTR(uuid, 1, 8),
  SUBSTR(uuid, 20, 4),
  SUBSTR(uuid, 25, 12)
));

CREATE
  FUNCTION ouuid_to_uuid(uuid BINARY(16))
  RETURNS VARCHAR(36)
  RETURN LOWER(CONCAT(
  SUBSTR(HEX(uuid), 9, 8), '-',
  SUBSTR(HEX(uuid), 5, 4), '-',
  SUBSTR(HEX(uuid), 1, 4), '-',
  SUBSTR(HEX(uuid), 17,4), '-',
  SUBSTR(HEX(uuid), 21, 12 )
));

测试

mysql> select '07a2f327-103a-11e9-8025-00ff5d11a779' as uuid , ouuid_to_uuid(uuid_to_ouuid('07a2f327-103a-11e9-8025-00ff5d11a779')) as flip_flop;
+--------------------------------------+--------------------------------------+
| uuid                                 | flip_flop                            |
+--------------------------------------+--------------------------------------+
| 07a2f327-103a-11e9-8025-00ff5d11a779 | 07a2f327-103a-11e9-8025-00ff5d11a779 |
+--------------------------------------+--------------------------------------+
1 row in set (0.00 sec)

更多信息

有关使用 Doctrine 的更多信息,请参阅 "使用 Doctrine 入门" 教程。

贡献

欢迎贡献!请阅读 CONTRIBUTING 了解详情。

版权和许可

ramsey/uuid-doctrine 库版权所有 © Ben Ramsey,并按照 MIT 许可协议(MIT)授权使用。有关更多信息,请参阅 LICENSE