Используйте 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). Пожалуйста, смотрите ЛИЦЕНЗИЮ для получения дополнительной информации.