2017 © Pedro Peláez
 

library uuid-doctrine

Allow the use of a ramsey/uuid UUID as Doctrine field type.

image

ramsey/uuid-doctrine

Allow the use of a ramsey/uuid UUID as Doctrine field type.

  • Wednesday, March 28, 2018
  • by ramsey
  • Repository
  • 16 Watchers
  • 311 Stars
  • 1,331,540 Installations
  • PHP
  • 50 Dependents
  • 5 Suggesters
  • 29 Forks
  • 11 Open issues
  • 10 Versions
  • 17 % Grown

The README.md

ramsey/uuid-doctrine

Use ramsey/uuid as a Doctrine field type , (*1)

Source Code Download Package PHP Programming Language Read License Build Status Codecov Code Coverage , (*2)

The ramsey/uuid-doctrine package provides the ability to use ramsey/uuid as a Doctrine field type., (*3)

This project adheres to a code of conduct. By participating in this project and its community, you are expected to uphold this code., (*4)

Installation

Install this package as a dependency using Composer., (*5)

``` bash composer require ramsey/uuid-doctrine, (*6)


## Usage ### Configuration To configure Doctrine to use ramsey/uuid as a field type, you'll need to set up the following in your bootstrap: ``` php \Doctrine\DBAL\Types\Type::addType('uuid', 'Ramsey\Uuid\Doctrine\UuidType');

In Symfony:, (*7)

``` yaml, (*8)

config/packages/doctrine.yaml

doctrine: dbal: types: uuid: Ramsey\Uuid\Doctrine\UuidType, (*9)


In Zend Framework: ```php <?php // module.config.php use Ramsey\Uuid\Doctrine\UuidType; return [ 'doctrine' => [ 'configuration' => [ 'orm_default' => [ 'types' => [ UuidType::NAME => UuidType::class,

In Laravel:, (*10)

<?php
// config/doctrine.php
    'custom_types'               => [
        \Ramsey\Uuid\Doctrine\UuidType::NAME => \Ramsey\Uuid\Doctrine\UuidType::class
    ],

In roave/psr-container-doctrine:, (*11)

<?php
use Ramsey\Uuid\Doctrine\UuidType;

return [
    'doctrine' => [
        'types' => [
            UuidType::NAME => UuidType::class,
        ],
        /* ... */
    ],
    /* ... */
];

Mappings

Then, in your models, you may annotate properties by setting the #[Column] type to uuid, and defining a custom generator of Ramsey\Uuid\UuidGenerator. Doctrine will handle the rest., (*12)

``` php use Doctrine\ORM\Mapping as ORM; use Ramsey\Uuid\Doctrine\UuidGenerator; use Ramsey\Uuid\UuidInterface;, (*13)

[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;, (*14)

public function getId(): UuidInterface
{
    return $this->id;
}

}, (*15)


If you use the XML Mapping instead of PHP attributes. ``` xml <id name="id" column="id" type="uuid"> <generator strategy="CUSTOM"/> <custom-id-generator class="Ramsey\Uuid\Doctrine\UuidGenerator"/> </id>

You can also use the YAML Mapping., (*16)

``` yaml id: id: type: uuid generator: strategy: CUSTOM customIdGenerator: class: Ramsey\Uuid\Doctrine\UuidGenerator, (*17)


### Binary database columns In the previous example, Doctrine will create a database column of type `CHAR(36)` if MariaDB / MySQL are in use, but you may also use this library to store UUIDs as binary strings. The `UuidBinaryType` helps accomplish this. In your bootstrap, place the following: ``` php \Doctrine\DBAL\Types\Type::addType('uuid_binary', 'Ramsey\Uuid\Doctrine\UuidBinaryType'); $entityManager->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('uuid_binary', 'binary');

In Symfony:, (*18)

``` yaml, (*19)

config/packages/doctrine.yaml

doctrine: dbal: types: uuid_binary: Ramsey\Uuid\Doctrine\UuidBinaryType, (*20)

Uncomment if using doctrine/orm <2.8

    # mapping_types:
        # uuid_binary: binary

Then, when annotating model class properties, use `uuid_binary` instead of `uuid`: #[Column(type: "uuid_binary")] ### InnoDB-optimised binary UUIDs - deprecated More suitable if you want to use UUIDs as primary key. Note that this can cause unintended effects if: * decoding bytes that were not generated using this method * another code (that isn't aware of this method) attempts to decode the resulting bytes More information in this [Percona article][percona-optimized-uuids] and [UUID Talk by Ben Ramsey][benramsey-com-uuid-talk] (starts at [slide 58][]). ``` php \Doctrine\DBAL\Types\Type::addType('uuid_binary_ordered_time', 'Ramsey\Uuid\Doctrine\UuidBinaryOrderedTimeType'); $entityManager->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('uuid_binary_ordered_time', 'binary');

In Symfony:, (*21)

``` yaml, (*22)

config/packages/doctrine.yaml

doctrine: dbal: types: uuid_binary_ordered_time: Ramsey\Uuid\Doctrine\UuidBinaryOrderedTimeType, (*23)

Uncomment if using doctrine/orm <2.8

    # mapping_types:
        # uuid_binary_ordered_time: binary

Then, in your models, you may annotate properties by setting the `@Column` type to `uuid_binary_ordered_time`, and defining a custom generator of `Ramsey\Uuid\UuidOrderedTimeGenerator`. Doctrine will handle the rest. ``` php #[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; } }

If you use the XML Mapping instead of PHP annotations., (*24)

``` xml , (*25)


### InnoDB-optimised binary UUIDs - new way With the introduction of new [UUID types](https://www.ietf.org/archive/id/draft-peabody-dispatch-new-uuid-format-04.html) (including sortable, unix epoch based UUID version 7) it is now recommended to use regular `uuid_binary` with `Ramsey\Uuid\Doctrine\UuidV7Generator` for primary keys. In your bootstrap, place the following: ``` php \Doctrine\DBAL\Types\Type::addType('uuid_binary', 'Ramsey\Uuid\Doctrine\UuidBinaryType'); $entityManager->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('uuid_binary', 'binary');

In Symfony:, (*26)

``` yaml, (*27)

config/packages/doctrine.yaml

doctrine: dbal: types: uuid_binary: Ramsey\Uuid\Doctrine\UuidBinaryType, (*28)

Uncomment if using doctrine/orm <2.8

    # mapping_types:
        # uuid_binary: binary

Then, in your models, you may annotate properties by setting the `#[Column]` type to `uuid_binary`, and defining a custom generator of `Ramsey\Uuid\UuidV7Generator`. Doctrine will handle the rest. ``` php #[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; } }

If you use the XML Mapping instead of PHP annotations., (*29)

``` xml , (*30)


### PostgreSQL considerations If you are using PostgreSQL, Doctrine uses PostgreSQL's `uuid` for the `Ramsey\Uuid\Doctrine\UuidType` (`uuid`). Therefor you don't need to use the `uuid_binary` / `uuid_binary_ordered_time` types when using PostgreSQL. You can still use `UuidV7Generator::class` to optimize indexing though. ``` php #[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; } }

Working with binary identifiers

When working with binary identifiers you may wish to convert them into a readable format. As of MySql 8.0 you can use the BIN_TO_UUID and UUID_TO_BIN functions documented here. The second argument determines if the byte order should be swapped, therefore when using uuid_binary you should pass 0 and when using uuid_binary_ordered_time you should pass 1., (*31)

For other versions you can use the following:, (*32)

``` sql DELIMITER $$, (*33)

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$$, (*34)

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$$, (*35)

DELIMITER ;, (*36)


Tests:

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), (*37)

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) ```, (*38)

More information

For more information on getting started with Doctrine, check out the "Getting Started with Doctrine" tutorial., (*39)

Contributing

Contributions are welcome! To contribute, please familiarize yourself with CONTRIBUTING.md., (*40)

Coordinated Disclosure

Keeping user information safe and secure is a top priority, and we welcome the contribution of external security researchers. If you believe you've found a security issue in software that is maintained in this repository, please read SECURITY.md for instructions on submitting a vulnerability report., (*41)

ramsey/uuid-doctrine for enterprise

Available as part of the Tidelift Subscription., (*42)

The maintainers of ramsey/uuid-doctrine and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. Learn more., (*43)

The ramsey/uuid-doctrine library is copyright © Ben Ramsey and licensed for use under the MIT License (MIT). Please see LICENSE for more information., (*44)

The Versions

28/03 2018

dev-master

9999999-dev https://github.com/ramsey/uuid-doctrine

Allow the use of a ramsey/uuid UUID as Doctrine field type.

  Sources   Download

MIT

The Requires

 

The Development Requires

uuid identifier guid doctrine

07/11 2017

1.4.3

1.4.3.0 https://github.com/ramsey/uuid-doctrine

Allow the use of a ramsey/uuid UUID as Doctrine field type.

  Sources   Download

MIT

The Requires

 

The Development Requires

uuid identifier guid doctrine

06/11 2017

1.4.2

1.4.2.0 https://github.com/ramsey/uuid-doctrine

Allow the use of a ramsey/uuid UUID as Doctrine field type.

  Sources   Download

MIT

The Requires

 

The Development Requires

uuid identifier guid doctrine

18/07 2017

1.4.1

1.4.1.0 https://github.com/ramsey/uuid-doctrine

Allow the use of a ramsey/uuid UUID as Doctrine field type.

  Sources   Download

MIT

The Requires

 

The Development Requires

uuid identifier guid doctrine

05/07 2017

1.4.0

1.4.0.0 https://github.com/ramsey/uuid-doctrine

Allow the use of a ramsey/uuid UUID as Doctrine field type.

  Sources   Download

MIT

The Requires

 

The Development Requires

uuid identifier guid doctrine

13/04 2017

1.3.0

1.3.0.0 https://github.com/ramsey/uuid-doctrine

Allow the use of a ramsey/uuid UUID as Doctrine field type.

  Sources   Download

MIT

The Requires

 

The Development Requires

uuid identifier guid doctrine

23/03 2016
01/02 2016
19/10 2015
28/09 2015