Ramsey/uuid를 Doctrine 필드 유형으로 사용
ramsey/uuid-doctrine 패키지는 ramsey/uuid를 Doctrine 필드 유형으로 사용하는 기능을 제공합니다.
이 프로젝트는 행동 강령을 준수합니다. 이 프로젝트와 커뮤니티에 참여함으로써 귀하는 이 강령을 준수해야 합니다.
Composer를 사용하여 이 패키지를 종속성으로 설치합니다.
composer require ramsey/uuid-doctrine
Ramsey/uuid를 필드 유형으로 사용하도록 Doctrine을 구성하려면 부트스트랩에서 다음을 설정해야 합니다.
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,
라라벨에서:
<?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 ;
}
}
PHP 속성 대신 XML 매핑을 사용하는 경우.
< 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
이전 예에서 Doctrine은 MariaDB/MySQL을 사용하는 경우 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
대신 uuid_binary
사용하세요.
#[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 ;
}
}
PHP 주석 대신 XML 매핑을 사용하는 경우.
< id name = " id " column = " id " type = " uuid_binary_ordered_time " >
< generator strategy = " CUSTOM " />
< custom-id-generator class = " RamseyUuidDoctrineUuidOrderedTimeGenerator " />
</ id >
새로운 UUID 유형(정렬 가능한 unix epoch 기반 UUID 버전 7 포함)이 도입되면서 이제 기본 키에 RamseyUuidDoctrineUuidV7Generator
와 함께 일반 uuid_binary
사용하는 것이 권장됩니다.
부트스트랩에 다음을 배치합니다.
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 ;
}
}
PHP 주석 대신 XML 매핑을 사용하는 경우.
< id name = " id " column = " id " type = " uuid_binary " >
< generator strategy = " CUSTOM " />
< custom-id-generator class = " RamseyUuidDoctrineUuidV7Generator " />
</ id >
PostgreSQL을 사용하는 경우 Doctrine은 RamseyUuidDoctrineUuidType
( uuid
)에 대해 PostgreSQL의 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)에 따라 사용이 허가되었습니다. 자세한 내용은 라이센스를 참조하세요.