• Stars
    star
    892
  • Rank 51,172 (Top 2 %)
  • Language
    PHP
  • License
    MIT License
  • Created over 9 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

β„οΈπŸ—„οΈ Allow the use of a ramsey/uuid UUID as Doctrine field type.

ramsey/uuid-doctrine

Use ramsey/uuid as a Doctrine field type

Source Code Download Package PHP Programming Language Read License Build Status Codecov Code Coverage Psalm Type Coverage

The ramsey/uuid-doctrine package provides the ability to use ramsey/uuid as a Doctrine field type.

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

Installation

Install this package as a dependency using Composer.

composer require ramsey/uuid-doctrine

Usage

Configuration

To configure Doctrine to use ramsey/uuid as a field type, you'll need to set up the following in your bootstrap:

\Doctrine\DBAL\Types\Type::addType('uuid', 'Ramsey\Uuid\Doctrine\UuidType');

In Symfony:

# config/packages/doctrine.yaml
doctrine:
    dbal:
        types:
            uuid: Ramsey\Uuid\Doctrine\UuidType

In Zend Framework:

<?php
// module.config.php
use Ramsey\Uuid\Doctrine\UuidType;

return [
    'doctrine' => [
        'configuration' => [
            'orm_default' => [
                'types' => [
                    UuidType::NAME => UuidType::class,

In Laravel:

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

In roave/psr-container-doctrine:

<?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.

use Doctrine\ORM\Mapping as ORM;
use Ramsey\Uuid\Doctrine\UuidGenerator;

/**
 * @ORM\Entity
 * @ORM\Table(name="products")
 */
class Product
{
    /**
     * @var \Ramsey\Uuid\UuidInterface
     *
     * @ORM\Id
     * @ORM\Column(type="uuid", unique=true)
     * @ORM\GeneratedValue(strategy="CUSTOM")
     * @ORM\CustomIdGenerator(class=UuidGenerator::class)
     */
    protected $id;

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

or, as follows, with PHP 8 attributes and type declarations:

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|string $id;

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

If you use the XML Mapping instead of PHP annotations.

<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.

id:
    id:
        type: uuid
        generator:
            strategy: CUSTOM
        customIdGenerator:
            class: Ramsey\Uuid\Doctrine\UuidGenerator

Binary database columns

In the previous example, Doctrine will create a database column of type CHAR(36), but you may also use this library to store UUIDs as binary strings. The UuidBinaryType helps accomplish this.

In your bootstrap, place the following:

\Doctrine\DBAL\Types\Type::addType('uuid_binary', 'Ramsey\Uuid\Doctrine\UuidBinaryType');
$entityManager->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('uuid_binary', 'binary');

In Symfony:

# config/packages/doctrine.yaml
doctrine:
    dbal:
        types:
            uuid_binary:  Ramsey\Uuid\Doctrine\UuidBinaryType
# 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 and UUID Talk by Ben Ramsey (starts at slide 58).

\Doctrine\DBAL\Types\Type::addType('uuid_binary_ordered_time', 'Ramsey\Uuid\Doctrine\UuidBinaryOrderedTimeType');
$entityManager->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('uuid_binary_ordered_time', 'binary');

In Symfony:

# config/packages/doctrine.yaml
doctrine:
   dbal:
       types:
           uuid_binary_ordered_time: Ramsey\Uuid\Doctrine\UuidBinaryOrderedTimeType
# 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.

/**
 * @Entity
 * @Table(name="products")
 */
class Product
{
    /**
     * @var \Ramsey\Uuid\UuidInterface
     *
     * @Id
     * @Column(type="uuid_binary_ordered_time", unique=true)
     * @GeneratedValue(strategy="CUSTOM")
     * @CustomIdGenerator(class="Ramsey\Uuid\Doctrine\UuidOrderedTimeGenerator")
     */
    protected $id;

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

If you use the XML Mapping instead of PHP annotations.

<id name="id" column="id" type="uuid_binary_ordered_time">
    <generator strategy="CUSTOM"/>
    <custom-id-generator class="Ramsey\Uuid\Doctrine\UuidOrderedTimeGenerator"/>
</id>

InnoDB-optimised binary UUIDs - new way

With the introduction of new UUID types (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:

\Doctrine\DBAL\Types\Type::addType('uuid_binary', 'Ramsey\Uuid\Doctrine\UuidBinaryType');
$entityManager->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('uuid_binary', 'binary');

In Symfony:

# config/packages/doctrine.yaml
doctrine:
    dbal:
        types:
            uuid_binary:  Ramsey\Uuid\Doctrine\UuidBinaryType
# 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.

/**
 * @Entity
 * @Table(name="products")
 */
class Product
{
    /**
     * @var \Ramsey\Uuid\UuidInterface
     *
     * @Id
     * @Column(type="uuid_binary", unique=true)
     * @GeneratedValue(strategy="CUSTOM")
     * @CustomIdGenerator(class="Ramsey\Uuid\Doctrine\UuidV7Generator")
     */
    protected $id;

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

If you use the XML Mapping instead of PHP annotations.

<id name="id" column="id" type="uuid_binary">
    <generator strategy="CUSTOM"/>
    <custom-id-generator class="Ramsey\Uuid\Doctrine\UuidV7Generator"/>
</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.

For other versions you can use the following:

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 ;

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)

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)

More information

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

Contributing

Contributions are welcome! To contribute, please familiarize yourself with CONTRIBUTING.md.

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.

ramsey/uuid-doctrine for enterprise

Available as part of the Tidelift Subscription.

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.

Copyright and License

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

More Repositories

1

uuid

❄️ A PHP library for generating universally unique identifiers (UUIDs).
PHP
12,432
star
2

collection

πŸ—‚οΈ A PHP library for representing and manipulating collections.
PHP
1,105
star
3

array_column

Provides functionality for array_column() to projects using PHP earlier than version 5.5.
PHP
372
star
4

php-library-starter-kit

πŸ—οΈ A tool to quickly set up the base files of a PHP library project.
PHP
243
star
5

composer-install

🎁 A GitHub Action to streamline installation of PHP dependencies with Composer.
Shell
227
star
6

conventional-commits

πŸͺ€ A PHP library for creating and validating commit messages according to the Conventional Commits specification. Includes a CaptainHook plugin!
PHP
181
star
7

composer-repl

🐚 A REPL for PHP built into Composer (using PsySH)
100
star
8

macos-vagrant-box

Scripts to generate Vagrant boxes for macOS
Shell
97
star
9

devtools

🧰 A Composer plugin to aid PHP library and application development.
66
star
10

identifier

A PHP library for generating and working with identifiers, including UUIDs, ULIDs, and Snowflakes
PHP
40
star
11

uuid-console

A console application for generating UUIDs with ramsey/uuid.
PHP
39
star
12

vagrant-php-src-dev

Uses Vagrant to provision a basic virtual environment for hacking on the PHP core.
Puppet
37
star
13

jenkins-php

A meta package for the PHP Quality Assurance Toolchain tools required by the Template for Jenkins Jobs for PHP Projects, http://jenkins-php.org/
35
star
14

php-rfcs

PHP
34
star
15

http-range

A PHP library for parsing and handling HTTP range requests.
PHP
31
star
16

laravel-oauth2-instagram

A Laravel 5 service provider for league/oauth2-instagram
PHP
29
star
17

beatles

The Beatles programming language
24
star
18

devtools-lib

πŸ§°πŸ“š The library behind ramsey/devtools, allowing for extension of the ramsey/devtools Composer plugin.
PHP
21
star
19

twig-codeblock

Syntax highlighting for Twig with the {% codeblock %} tag.
PHP
19
star
20

vnderror

application/vnd.error builder/formatter for PHP 5.3+
PHP
17
star
21

oauth2-example

Full Laravel source application for example in "Mastering OAuth 2.0" articles and talks.
PHP
17
star
22

php-museum-exhibits

HTML
15
star
23

gitea-environment

Shell
9
star
24

ext-ecma_intl

A PHP implementation of the ECMAScript 2023 Internationalization API Specification (ECMA-402)
C
9
star
25

coding-standard

🧼 A common coding standard for @ramsey's PHP libraries.
PHP
8
star
26

math

This package is abandoned. Try brick/math instead: https://github.com/brick/math
PHP
8
star
27

pdo_oci8

PHP userspace classes for Oracle to mimic the PDO interface while wrapping the oci8 functions.
PHP
7
star
28

dotfiles

The dotfiles I use on my systems
Vim Script
7
star
29

str-begins-ends

Provides functions to test whether a string begins or ends with a certain substring.
PHP
5
star
30

rhumsaa-uuid

NO LONGER MAINTAINED. Use ramsey/uuid instead.
PHP
5
star
31

jupyter-php-docker

Dockerfile
4
star
32

MantisBT-HipChat

HipChat integration for Mantis bug tracker
PHP
3
star
33

sculpin-codeblock

A Sculpin bundle for using the ramsey/twig-codeblock extension for defining blocks of code for syntax highlighting (with Pygments) and more.
PHP
2
star
34

php-icu-testing

Dockerfile
2
star
35

http2-php-playground

PHP
2
star
36

uuid-benchmark

Benchmark tests for ramsey/uuid
PHP
2
star
37

docker-pennmush

A Docker image for PennMUSH, a MUD-style server.
Shell
2
star
38

docker-jupyter-php

Shell
2
star
39

composer-repl-lib

πŸšπŸ“š The library behind ramsey/composer-repl, allowing for extension of the ramsey/composer-repl Composer plugin and non-plugin use of the repl command.
PHP
2
star
40

composer-plugin-issue

This repo illustrates a problem I discovered with using Composer plugins.
1
star
41

gimmebutton

A Gimme Bar toolbar button for Firefox
Shell
1
star
42

website

My personal website
PHP
1
star
43

api-toolbox

Examples used in my "A Toolbox for APIs & Integrations" presentation.
PHP
1
star
44

base

Arbitrary base conversion and encoding/decoding for all the bases that are belong to us.
PHP
1
star
45

matrix-environment

Shell
1
star