使用 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) 獲得使用許可。請參閱許可證以了解更多資訊。