品牌导向 / uuid-doctrine
允许将 ramsey/uuid 作为 Doctrine 字段类型使用。
Requires
- php: ^7.4 | ^8
- doctrine/dbal: ^2.5 | ^3.0
- doctrine/orm: ^2
- ramsey/uuid: ^4
Replaces
README
ramsey/uuid-doctrine 包提供了将 ramsey/uuid 作为 Doctrine 字段类型使用的功能。
本项目遵守贡献者行为准则。参与本项目及其社区,您应遵守此准则。
安装
推荐的安装方法是通过 Packagist 和 Composer。运行以下命令安装包并将其添加到项目的 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。