使用 ramsey/uuid 作为 Doctrine 字段类型
ramsey/uuid-doctrine 包提供了使用 ramsey/uuid 作为 Doctrine 字段类型的能力。
该项目遵守行为准则。通过参与此项目及其社区,您应该遵守此准则。
使用 Composer 将此包安装为依赖项。
composer require ramsey/uuid-doctrine
要将 Doctrine 配置为使用 ramsey/uuid 作为字段类型,您需要在引导程序中设置以下内容:
Doctrine DBAL Types Type:: addType ( ' uuid ' , ' RamseyUuidDoctrineUuidType ' );
在交响乐中:
# config/packages/doctrine.yaml
doctrine :
dbal :
types :
uuid : RamseyUuidDoctrineUuidType
在 Zend 框架中:
<?php
// module . config . php
use Ramsey Uuid Doctrine UuidType ;
return [
' doctrine ' => [
' configuration ' => [
' orm_default ' => [
' types ' => [
UuidType:: NAME => UuidType::class,
在 Laravel 中:
<?php
// config / doctrine . php
' custom_types ' => [
Ramsey Uuid Doctrine UuidType:: NAME => Ramsey Uuid Doctrine UuidType::class
],
在 roave/psr-container-doctrine 中:
<?php
use Ramsey Uuid Doctrine UuidType ;
return [
' doctrine ' => [
' types ' => [
UuidType:: NAME => UuidType::class,
],
/* ... */
],
/* ... */
];
然后,在模型中,您可以通过将#[Column]
类型设置为uuid
并定义RamseyUuidUuidGenerator
的自定义生成器来注释属性。教义将处理剩下的事情。
use Doctrine ORM Mapping as ORM ;
use Ramsey Uuid Doctrine UuidGenerator ;
use Ramsey Uuid UuidInterface ;
#[ ORM Entity]
#[ ORM Table(name: " products " )]
class Product
{
#[ ORM Id]
#[ ORM Column(type: " uuid " , unique: true )]
#[ ORM GeneratedValue(strategy: " CUSTOM " )]
#[ ORM CustomIdGenerator(class: UuidGenerator::class)]
protected UuidInterface $ id ;
public function getId (): UuidInterface
{
return $ this -> id ;
}
}
如果您使用 XML 映射而不是 PHP 属性。
< id name = " id " column = " id " type = " uuid " >
< generator strategy = " CUSTOM " />
< custom-id-generator class = " RamseyUuidDoctrineUuidGenerator " />
</ id >
您还可以使用 YAML 映射。
id :
id :
type : uuid
generator :
strategy : CUSTOM
customIdGenerator :
class : RamseyUuidDoctrineUuidGenerator
在前面的示例中,如果使用 MariaDB / MySQL,Doctrine 将创建一个CHAR(36)
类型的数据库列,但您也可以使用此库将 UUID 存储为二进制字符串。 UuidBinaryType
有助于实现这一点。
在您的引导程序中,放置以下内容:
Doctrine DBAL Types Type:: addType ( ' uuid_binary ' , ' RamseyUuidDoctrineUuidBinaryType ' );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' uuid_binary ' , ' binary ' );
在交响乐中:
# config/packages/doctrine.yaml
doctrine :
dbal :
types :
uuid_binary : RamseyUuidDoctrineUuidBinaryType
# Uncomment if using doctrine/orm <2.8
# mapping_types:
# uuid_binary: binary
然后,在注释模型类属性时,使用uuid_binary
而不是uuid
:
#[Column(type: "uuid_binary")]
如果您想使用 UUID 作为主键,则更适合。请注意,如果出现以下情况,这可能会导致意想不到的影响:
更多信息请参见这篇 Percona 文章和 Ben Ramsey 的 UUID Talk(从幻灯片 58 开始)。
Doctrine DBAL Types Type:: addType ( ' uuid_binary_ordered_time ' , ' RamseyUuidDoctrineUuidBinaryOrderedTimeType ' );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' uuid_binary_ordered_time ' , ' binary ' );
在交响乐中:
# config/packages/doctrine.yaml
doctrine :
dbal :
types :
uuid_binary_ordered_time : RamseyUuidDoctrineUuidBinaryOrderedTimeType
# Uncomment if using doctrine/orm <2.8
# mapping_types:
# uuid_binary_ordered_time: binary
然后,在模型中,您可以通过将@Column
类型设置为uuid_binary_ordered_time
并定义RamseyUuidUuidOrderedTimeGenerator
的自定义生成器来注释属性。教义将处理剩下的事情。
#[Entity]
#[Table(name: " products " )]´
class Product
{
#[Id]
#[Column(type: " uuid_binary_ordered_time " , unique: true )]
#[GeneratedValue(strategy: " CUSTOM " )]
#[CustomIdGenerator(class: UuidOrderedTimeGenerator::class)]
protected UuidInterface $ id ;
public function getId (): UuidInterface
{
return $ this -> id ;
}
}
如果您使用 XML 映射而不是 PHP 注释。
< id name = " id " column = " id " type = " uuid_binary_ordered_time " >
< generator strategy = " CUSTOM " />
< custom-id-generator class = " RamseyUuidDoctrineUuidOrderedTimeGenerator " />
</ id >
随着新 UUID 类型的引入(包括可排序、基于 unix 纪元的 UUID 版本 7),现在建议使用常规uuid_binary
和RamseyUuidDoctrineUuidV7Generator
作为主键。
在您的引导程序中,放置以下内容:
Doctrine DBAL Types Type:: addType ( ' uuid_binary ' , ' RamseyUuidDoctrineUuidBinaryType ' );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' uuid_binary ' , ' binary ' );
在交响乐中:
# config/packages/doctrine.yaml
doctrine :
dbal :
types :
uuid_binary : RamseyUuidDoctrineUuidBinaryType
# Uncomment if using doctrine/orm <2.8
# mapping_types:
# uuid_binary: binary
然后,在模型中,您可以通过将#[Column]
类型设置为uuid_binary
并定义RamseyUuidUuidV7Generator
的自定义生成器来注释属性。教义将处理剩下的事情。
#[Entity]
#[Table(name: " products " )]
class Product
{
#[Id]
#[Column(type: " uuid_binary " , unique: true )]
#[GeneratedValue(strategy: " CUSTOM " )]
#[CustomIdGenerator(class: UuidV7Generator::class)]
protected UuidInterface $ id ;
public function getId (): UuidInterface
{
return $ this -> id ;
}
}
如果您使用 XML 映射而不是 PHP 注释。
< id name = " id " column = " id " type = " uuid_binary " >
< generator strategy = " CUSTOM " />
< custom-id-generator class = " RamseyUuidDoctrineUuidV7Generator " />
</ id >
如果您使用 PostgreSQL,Doctrine 使用 PostgreSQL 的uuid
作为RamseyUuidDoctrineUuidType
( uuid
)。因此,在使用 PostgreSQL 时,不需要使用uuid_binary
/ uuid_binary_ordered_time
类型。不过,您仍然可以使用UuidV7Generator::class
来优化索引。
#[Entity]
#[Table(name: " products " )]
class Product
{
#[Id]
#[Column(type: " uuid " , unique: true )]
#[GeneratedValue(strategy: " CUSTOM " )]
#[CustomIdGenerator(class: UuidV7Generator::class)]
protected UuidInterface $ id ;
public function getId (): UuidInterface
{
return $ this -> id ;
}
}
使用二进制标识符时,您可能希望将它们转换为可读格式。从 MySql 8.0 开始,您可以使用此处记录的 BIN_TO_UUID 和 UUID_TO_BIN 函数。第二个参数确定是否应该交换字节顺序,因此在使用uuid_binary
时应传递 0,在使用uuid_binary_ordered_time
时应传递 1。
对于其他版本,您可以使用以下内容:
DELIMITER $$
CREATE
FUNCTION BIN_TO_UUID(bin_uuid BINARY( 16 ), swap_flag BOOLEAN )
RETURNS CHAR ( 36 )
DETERMINISTIC
BEGIN
DECLARE hex_uuid CHAR ( 32 );
SET hex_uuid = HEX(bin_uuid);
RETURN LOWER (CONCAT(
IF(swap_flag, SUBSTR(hex_uuid, 9 , 8 ),SUBSTR(hex_uuid, 1 , 8 )), ' - ' ,
IF(swap_flag, SUBSTR(hex_uuid, 5 , 4 ),SUBSTR(hex_uuid, 9 , 4 )), ' - ' ,
IF(swap_flag, SUBSTR(hex_uuid, 1 , 4 ),SUBSTR(hex_uuid, 13 , 4 )), ' - ' ,
SUBSTR(hex_uuid, 17 , 4 ), ' - ' ,
SUBSTR(hex_uuid, 21 )
));
END$$
CREATE
FUNCTION UUID_TO_BIN(str_uuid CHAR ( 36 ), swap_flag BOOLEAN )
RETURNS BINARY( 16 )
DETERMINISTIC
BEGIN
RETURN UNHEX(CONCAT(
IF(swap_flag, SUBSTR(str_uuid, 15 , 4 ),SUBSTR(str_uuid, 1 , 8 )),
SUBSTR(str_uuid, 10 , 4 ),
IF(swap_flag, SUBSTR(str_uuid, 1 , 8 ),SUBSTR(str_uuid, 15 , 4 )),
SUBSTR(str_uuid, 20 , 4 ),
SUBSTR(str_uuid, 25 ))
);
END$$
DELIMITER ;
测试:
mysql> select '07a2f327-103a-11e9-8025-00ff5d11a779' as uuid, BIN_TO_UUID(UUID_TO_BIN('07a2f327-103a-11e9-8025-00ff5d11a779', 0), 0) as flip_flop;
+--------------------------------------+--------------------------------------+
| uuid | flip_flop |
+--------------------------------------+--------------------------------------+
| 07a2f327-103a-11e9-8025-00ff5d11a779 | 07a2f327-103a-11e9-8025-00ff5d11a779 |
+--------------------------------------+--------------------------------------+
1 row in set (0.00 sec)
mysql> select '07a2f327-103a-11e9-8025-00ff5d11a779' as uuid, BIN_TO_UUID(UUID_TO_BIN('07a2f327-103a-11e9-8025-00ff5d11a779', 1), 1) 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.md。
保证用户信息安全是首要任务,我们欢迎外部安全研究人员的贡献。如果您认为在此存储库中维护的软件中发现了安全问题,请阅读 SECURITY.md 以获取有关提交漏洞报告的说明。
作为 Tidelift 订阅的一部分提供。
ramsey/uuid-doctrine 和数千个其他软件包的维护者正在与 Tidelift 合作,为您用于构建应用程序的开源软件包提供商业支持和维护。节省时间、降低风险并改善代码运行状况,同时向您使用的确切软件包的维护人员付费。了解更多。
ramsey/uuid-doctrine 库版权所有 © Ben Ramsey,并根据 MIT 许可证 (MIT) 获得使用许可。请参阅许可证了解更多信息。