Gunakan ramsey/uuid sebagai jenis bidang Doktrin
Paket ramsey/uuid-doctrine menyediakan kemampuan untuk menggunakan ramsey/uuid sebagai tipe bidang Doktrin.
Proyek ini mematuhi kode etik. Dengan berpartisipasi dalam proyek ini dan komunitasnya, Anda diharapkan menjunjung tinggi kode ini.
Instal paket ini sebagai dependensi menggunakan Komposer.
composer require ramsey/uuid-doctrine
Untuk mengonfigurasi Doctrine agar menggunakan ramsey/uuid sebagai jenis bidang, Anda perlu menyiapkan yang berikut ini di bootstrap Anda:
Doctrine DBAL Types Type:: addType ( ' uuid ' , ' RamseyUuidDoctrineUuidType ' );
Di Symfony:
# config/packages/doctrine.yaml
doctrine :
dbal :
types :
uuid : RamseyUuidDoctrineUuidType
Dalam Kerangka Zend:
<?php
// module . config . php
use Ramsey Uuid Doctrine UuidType ;
return [
' doctrine ' => [
' configuration ' => [
' orm_default ' => [
' types ' => [
UuidType:: NAME => UuidType::class,
Di Laravel:
<?php
// config / doctrine . php
' custom_types ' => [
Ramsey Uuid Doctrine UuidType:: NAME => Ramsey Uuid Doctrine UuidType::class
],
Dalam doktrin roave/psr-container:
<?php
use Ramsey Uuid Doctrine UuidType ;
return [
' doctrine ' => [
' types ' => [
UuidType:: NAME => UuidType::class,
],
/* ... */
],
/* ... */
];
Kemudian, dalam model Anda, Anda dapat memberi anotasi pada properti dengan menyetel tipe #[Column]
ke uuid
, dan menentukan generator khusus RamseyUuidUuidGenerator
. Doktrin akan menangani sisanya.
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 ;
}
}
Jika Anda menggunakan Pemetaan XML alih-alih atribut PHP.
< id name = " id " column = " id " type = " uuid " >
< generator strategy = " CUSTOM " />
< custom-id-generator class = " RamseyUuidDoctrineUuidGenerator " />
</ id >
Anda juga dapat menggunakan Pemetaan YAML.
id :
id :
type : uuid
generator :
strategy : CUSTOM
customIdGenerator :
class : RamseyUuidDoctrineUuidGenerator
Pada contoh sebelumnya, Doctrine akan membuat kolom database bertipe CHAR(36)
jika MariaDB / MySQL sedang digunakan, namun Anda juga dapat menggunakan perpustakaan ini untuk menyimpan UUID sebagai string biner. UuidBinaryType
membantu mencapai hal ini.
Di bootstrap Anda, tempatkan yang berikut ini:
Doctrine DBAL Types Type:: addType ( ' uuid_binary ' , ' RamseyUuidDoctrineUuidBinaryType ' );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' uuid_binary ' , ' binary ' );
Di Symfony:
# config/packages/doctrine.yaml
doctrine :
dbal :
types :
uuid_binary : RamseyUuidDoctrineUuidBinaryType
# Uncomment if using doctrine/orm <2.8
# mapping_types:
# uuid_binary: binary
Lalu, saat memberi anotasi pada properti kelas model, gunakan uuid_binary
alih-alih uuid
:
#[Column(type: "uuid_binary")]
Lebih cocok jika Anda ingin menggunakan UUID sebagai kunci utama. Perhatikan bahwa hal ini dapat menyebabkan efek yang tidak diinginkan jika:
Informasi lebih lanjut ada di artikel Percona ini dan UUID Talk oleh Ben Ramsey (dimulai dari slide 58).
Doctrine DBAL Types Type:: addType ( ' uuid_binary_ordered_time ' , ' RamseyUuidDoctrineUuidBinaryOrderedTimeType ' );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' uuid_binary_ordered_time ' , ' binary ' );
Di Symfony:
# 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
Kemudian, dalam model Anda, Anda dapat memberi anotasi pada properti dengan menyetel tipe @Column
ke uuid_binary_ordered_time
, dan menentukan generator khusus RamseyUuidUuidOrderedTimeGenerator
. Doktrin akan menangani sisanya.
#[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 ;
}
}
Jika Anda menggunakan Pemetaan XML alih-alih anotasi PHP.
< id name = " id " column = " id " type = " uuid_binary_ordered_time " >
< generator strategy = " CUSTOM " />
< custom-id-generator class = " RamseyUuidDoctrineUuidOrderedTimeGenerator " />
</ id >
Dengan diperkenalkannya tipe UUID baru (termasuk UUID versi 7 yang dapat diurutkan dan berbasis zaman unix), sekarang disarankan untuk menggunakan uuid_binary
biasa dengan RamseyUuidDoctrineUuidV7Generator
untuk kunci utama.
Di bootstrap Anda, tempatkan yang berikut ini:
Doctrine DBAL Types Type:: addType ( ' uuid_binary ' , ' RamseyUuidDoctrineUuidBinaryType ' );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' uuid_binary ' , ' binary ' );
Di Symfony:
# config/packages/doctrine.yaml
doctrine :
dbal :
types :
uuid_binary : RamseyUuidDoctrineUuidBinaryType
# Uncomment if using doctrine/orm <2.8
# mapping_types:
# uuid_binary: binary
Kemudian, dalam model Anda, Anda dapat memberi anotasi pada properti dengan menyetel tipe #[Column]
ke uuid_binary
, dan menentukan generator khusus RamseyUuidUuidV7Generator
. Doktrin akan menangani sisanya.
#[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 ;
}
}
Jika Anda menggunakan Pemetaan XML alih-alih anotasi PHP.
< id name = " id " column = " id " type = " uuid_binary " >
< generator strategy = " CUSTOM " />
< custom-id-generator class = " RamseyUuidDoctrineUuidV7Generator " />
</ id >
Jika Anda menggunakan PostgreSQL, Doctrine menggunakan uuid
PostgreSQL untuk RamseyUuidDoctrineUuidType
( uuid
). Oleh karena itu Anda tidak perlu menggunakan tipe uuid_binary
/ uuid_binary_ordered_time
saat menggunakan PostgreSQL. Anda masih dapat menggunakan UuidV7Generator::class
untuk mengoptimalkan pengindeksan.
#[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 ;
}
}
Saat bekerja dengan pengidentifikasi biner, Anda mungkin ingin mengubahnya menjadi format yang dapat dibaca. Pada MySql 8.0 Anda dapat menggunakan fungsi BIN_TO_UUID dan UUID_TO_BIN yang didokumentasikan di sini. Argumen kedua menentukan apakah urutan byte harus ditukar, oleh karena itu ketika menggunakan uuid_binary
Anda harus meneruskan 0 dan ketika menggunakan uuid_binary_ordered_time
Anda harus meneruskan 1.
Untuk versi lain Anda dapat menggunakan yang berikut ini:
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 ;
Tes:
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)
Untuk informasi lebih lanjut tentang memulai dengan Doctrine, lihat tutorial "Memulai dengan Doctrine".
Kontribusi dipersilahkan! Untuk berkontribusi, silakan membiasakan diri dengan CONTRIBUTING.md.
Menjaga informasi pengguna tetap aman dan terjamin adalah prioritas utama, dan kami menyambut baik kontribusi peneliti keamanan eksternal. Jika Anda yakin telah menemukan masalah keamanan pada perangkat lunak yang disimpan dalam repositori ini, silakan baca SECURITY.md untuk petunjuk cara mengirimkan laporan kerentanan.
Tersedia sebagai bagian dari Langganan Tidelift.
Pengelola ramsey/uuid-doctrine dan ribuan paket lainnya bekerja sama dengan Tidelift untuk memberikan dukungan komersial dan pemeliharaan untuk paket sumber terbuka yang Anda gunakan untuk membangun aplikasi Anda. Menghemat waktu, mengurangi risiko, dan meningkatkan kesehatan kode, sekaligus membayar pengelola paket yang sama persis dengan yang Anda gunakan. Pelajari lebih lanjut.
Perpustakaan ramsey/uuid-doctrine adalah hak cipta © Ben Ramsey dan dilisensikan untuk digunakan di bawah Lisensi MIT (MIT). Silakan lihat LISENSI untuk informasi lebih lanjut.