Doctrine フィールドタイプとして ramsey/uuid を使用する
ramsey/uuid-doctrine パッケージは、ramsey/uuid を Doctrine フィールド タイプとして使用する機能を提供します。
このプロジェクトは行動規範に従っています。このプロジェクトとそのコミュニティに参加することにより、この規範を遵守することが期待されます。
Composer を使用して、このパッケージを依存関係としてインストールします。
composer require ramsey/uuid-doctrine
ramsey/uuid をフィールドタイプとして使用するように Doctrine を設定するには、ブートストラップで以下を設定する必要があります。
Doctrine DBAL Types Type:: addType ( ' uuid ' , ' RamseyUuidDoctrineUuidType ' );
Symfony の場合:
# config/packages/doctrine.yaml
doctrine :
dbal :
types :
uuid : RamseyUuidDoctrineUuidType
Zend フレームワークの場合:
<?php
// module . config . php
use Ramsey Uuid Doctrine UuidType ;
return [
' doctrine ' => [
' configuration ' => [
' orm_default ' => [
' types ' => [
UuidType:: NAME => UuidType::class,
Laravel の場合:
<?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 ;
}
}
PHP 属性の代わりに XML マッピングを使用する場合。
< 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
前の例では、MariaDB / MySQL が使用されている場合、Doctrine はCHAR(36)
型のデータベース列を作成しますが、このライブラリを使用して UUID をバイナリ文字列として保存することもできます。 UuidBinaryType
これを実現するのに役立ちます。
ブートストラップに以下を配置します。
Doctrine DBAL Types Type:: addType ( ' uuid_binary ' , ' RamseyUuidDoctrineUuidBinaryType ' );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' uuid_binary ' , ' binary ' );
Symfony の場合:
# config/packages/doctrine.yaml
doctrine :
dbal :
types :
uuid_binary : RamseyUuidDoctrineUuidBinaryType
# Uncomment if using doctrine/orm <2.8
# mapping_types:
# uuid_binary: binary
次に、モデル クラスのプロパティに注釈を付けるときに、 uuid
の代わりにuuid_binary
を使用します。
#[Column(type: "uuid_binary")]
UUID を主キーとして使用する場合に適しています。次の場合、これにより予期しない影響が生じる可能性があることに注意してください。
詳細については、この Percona の記事と Ben Ramsey による UUID トーク (スライド 58 から始まります) を参照してください。
Doctrine DBAL Types Type:: addType ( ' uuid_binary_ordered_time ' , ' RamseyUuidDoctrineUuidBinaryOrderedTimeType ' );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' uuid_binary_ordered_time ' , ' binary ' );
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
次に、モデル内で@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 ;
}
}
PHP アノテーションの代わりに XML マッピングを使用する場合。
< id name = " id " column = " id " type = " uuid_binary_ordered_time " >
< generator strategy = " CUSTOM " />
< custom-id-generator class = " RamseyUuidDoctrineUuidOrderedTimeGenerator " />
</ id >
新しい UUID タイプ (ソート可能な Unix エポック ベースの UUID バージョン 7 を含む) の導入により、主キーには通常のuuid_binary
とRamseyUuidDoctrineUuidV7Generator
を使用することが推奨されます。
ブートストラップに以下を配置します。
Doctrine DBAL Types Type:: addType ( ' uuid_binary ' , ' RamseyUuidDoctrineUuidBinaryType ' );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' uuid_binary ' , ' binary ' );
Symfony の場合:
# 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 ;
}
}
PHP アノテーションの代わりに XML マッピングを使用する場合。
< id name = " id " column = " id " type = " uuid_binary " >
< generator strategy = " CUSTOM " />
< custom-id-generator class = " RamseyUuidDoctrineUuidV7Generator " />
</ id >
PostgreSQL を使用している場合、Doctrine は PostgreSQL のuuid
RamseyUuidDoctrineUuidType
( uuid
) に使用します。したがって、PostgreSQL を使用する場合は、 uuid_binary
/ uuid_binary_ordered_time
タイプを使用する必要はありません。ただし、 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 関数を使用できます。 2 番目の引数はバイト順序を交換するかどうかを決定するため、 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 License (MIT) に基づいて使用が許可されています。詳細については、「ライセンス」を参照してください。