Используйте 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 Framework:
<?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 ;
}
}Если вы используете сопоставление 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 помогает добиться этого.
В вашем бутстрапе поместите следующее:
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 (начинается со слайда 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) теперь рекомендуется использовать обычный 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 использует 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)
Для получения дополнительной информации о начале работы с Doctrine ознакомьтесь с руководством «Начало работы с Doctrine».
Вклады приветствуются! Чтобы внести свой вклад, пожалуйста, ознакомьтесь с CONTRIBUTING.md.
Обеспечение безопасности и защиты пользовательской информации является главным приоритетом, и мы приветствуем вклад внешних исследователей в области безопасности. Если вы считаете, что обнаружили проблему безопасности в программном обеспечении, хранящемся в этом репозитории, прочтите SECURITY.md, чтобы получить инструкции по отправке отчета об уязвимости.
Доступно как часть подписки Tidelift.
Разработчики ramsey/uuid-doctrine и тысяч других пакетов сотрудничают с Tidelift, чтобы обеспечить коммерческую поддержку и обслуживание пакетов с открытым исходным кодом, которые вы используете для создания своих приложений. Экономьте время, снижайте риски и улучшайте работоспособность кода, платя при этом разработчикам тех пакетов, которые вы используете. Узнать больше.
Библиотека ramsey/uuid-doctrine защищена авторскими правами © Ben Ramsey и лицензирована для использования по лицензии MIT (MIT). Пожалуйста, смотрите ЛИЦЕНЗИЮ для получения дополнительной информации.