ใช้ 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
ในตัวอย่างก่อนหน้านี้ Doctrine จะสร้างคอลัมน์ฐานข้อมูลประเภท CHAR(36)
หากมีการใช้งาน MariaDB / MySQL แต่คุณอาจใช้ไลบรารีนี้เพื่อจัดเก็บ UUID เป็นสตริงไบนารี่ได้ UuidBinaryType
ช่วยให้บรรลุเป้าหมายนี้
ใน bootstrap ของคุณ ให้วางสิ่งต่อไปนี้:
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 และ UUID Talk โดย Ben Ramsey (เริ่มที่สไลด์ 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 ใหม่ (รวมถึง UUID เวอร์ชัน 7 ที่ใช้ Unix epoch ที่จัดเรียงได้) ตอนนี้ขอแนะนำให้ใช้ uuid_binary
ปกติกับ RamseyUuidDoctrineUuidV7Generator
สำหรับคีย์หลัก
ใน bootstrap ของคุณ ให้วางสิ่งต่อไปนี้:
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 จะใช้ uuid
ของ PostgreSQL สำหรับ RamseyUuidDoctrineUuidType
( uuid
) ดังนั้นคุณไม่จำเป็นต้องใช้ประเภท uuid_binary
/ uuid_binary_ordered_time
เมื่อใช้ PostgreSQL คุณยังคงสามารถใช้ 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)
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มต้นใช้งานหลักคำสอน โปรดดูบทช่วยสอน "การเริ่มต้นใช้งานหลักคำสอน"
ยินดีบริจาค! หากต้องการมีส่วนร่วม โปรดทำความคุ้นเคยกับ CONTRIBUTING.md
การรักษาข้อมูลผู้ใช้ให้ปลอดภัยถือเป็นสิ่งสำคัญสูงสุด และเรายินดีรับการสนับสนุนจากนักวิจัยด้านความปลอดภัยภายนอก หากคุณเชื่อว่าคุณพบปัญหาด้านความปลอดภัยในซอฟต์แวร์ที่เก็บรักษาไว้ในที่เก็บข้อมูลนี้ โปรดอ่าน SECURITY.md เพื่อดูคำแนะนำในการส่งรายงานช่องโหว่
มีให้เป็นส่วนหนึ่งของการสมัครสมาชิก Tidelift
ผู้ดูแล ramsey/uuid-doctrine และแพ็คเกจอื่นๆ หลายพันรายการกำลังทำงานร่วมกับ Tidelift เพื่อให้การสนับสนุนเชิงพาณิชย์และการบำรุงรักษาสำหรับแพ็คเกจโอเพ่นซอร์สที่คุณใช้ในการสร้างแอปพลิเคชันของคุณ ประหยัดเวลา ลดความเสี่ยง และปรับปรุงประสิทธิภาพของโค้ด ในขณะเดียวกันก็จ่ายเงินให้กับผู้ดูแลแพ็คเกจที่คุณใช้ เรียนรู้เพิ่มเติม
ห้องสมุด ramsey/uuid-doctrine เป็นลิขสิทธิ์© Ben Ramsey และได้รับอนุญาตให้ใช้ภายใต้ใบอนุญาต MIT (MIT) โปรดดูใบอนุญาตสำหรับข้อมูลเพิ่มเติม