昨日、私は Symfony がブログ投稿 (https://symfony.com/blog/new-in-symfony-5-2-doctrine-types-for-uuid-and-ulid) で叫んだことを実行しようとしましたが、失敗した。 ULID (「TTTTTTTTTTRRRRRRRRRRRR」形式) をデータベースに保存したいと考えています。これは、ULID は並べ替え可能であるだけでなく、アプリケーションに最適なタイムスタンプも含まれているためです。ただし、属性に「type=ulid」を指定すると、UUID (形式: 「xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx」) としてデータベースに保存されます。
長い間デバッグしていましたが、あまりにイライラしたので最初からやり直しましたが、問題はまだ解決していません。
###どこで私は間違えましたか?
(必要に応じて ULID ヘッダーまでスキップしてください。以下は長く見えるかもしれませんが、その 50% は基本的な内容です) ###交響曲###
私が何度も繰り返すこと https://symfony.com/doc/5.4/setup.html から引用:
composer プロジェクトを作成 symfony/sculpture:5.4.* shit
cd 恥ずかしがり屋; コンポーザーには Web アプリが必要です Docker 構成をレシピに含めますか?はい (デフォルト)
ORM
composer には --dev symfony/maker-bundle が必要です
docker-compose up -d
そこで、docker-compose.override.yml ファイルにいくつかの行を追加しました。 リーリーbin/console Doctrine:database:createホスト「10.1.2.3」の「.env」にDATABASE_URLを設定します
default という名前の接続にデータベース「app」を作成できません
クエリの実行中に例外が発生しました: SQLSTATE[42P04]: 重複データベース: 7 エラー: データベース "app" はすでに存在します
make:entity
は、ULID 機能ができるまで延期されます。
私たちは https://symfony.com/doc/5.4/components/uid.html (特に ULID 部分) に傾いています: #
ULIDエンティティのテスト
composer には phpunit が必要です
データベース エントリをプログラムで作成するbin/コンソール --env=testism:移行:移行
bin/コンソール --env=testism:database:create
bin/console --env=test ism:query:sql 'TRUNCATE Product'
念のためbin/phpunit
bin/console --env=testism:query:sql 'SELECT * FROM product'
ULID ではなく UUID を表示します。
データベース内の UUID の代わりに ULID を表示します
まずクリーンアップしてから、https://symfony.com/doc/5.4/components/uid.html#ulids に示されている例を実行します。
rm 移行/*
最初からやり直すbin/コンソール --env=testism:database:drop --force
bin/コンソール --env=testism:database:create
bin/console-ism:database:drop --force
bin/コンソール --env=testism:database:create
(ドキュメントの例にはリポジトリ行がありません)
bin/コンソール make:migration
bin/コンソール --env=testism:移行:移行
bin/phpunit
(リスクがあっても大丈夫)bin/console --env=testism:query:sql 'SELECT * FROM product'
ULID の代わりに UUID を再度使用します
データベースには ULID ではなく UUID が表示されます
P粉3774120962023-12-17 00:06:49
少し遅れましたが、この問題に直面している人のために、ULID の代わりに UUID を表示するデータベースもあります。これは、UUID/ULID を互換的に使用できるため、Doctrine では予期される動作であると思われます。つまり、UUID をデータベースに保存することもできます。ただし、エンティティは ULID にマップされており、データベースからオブジェクトを取得するときに ULID が得られます。ULID または UUID を使用して同じオブジェクトを取得することもできます。
たとえば、識別子に ULID を持つユーザー エンティティがあるため、保存されるオブジェクトの uuid は次のようになります。
リーリーその UUID を使用してユーザーを取得すると、次の結果が得られます:
リーリーこれで、その ULID を使用してユーザーを取得しても、同様に機能します。
UUID を確認すると、返されたオブジェクトの UUID が Base 32 に変換されていることがわかります。 リーリー
最後に、次のように refc4122 に変換することで、保存された uuid を取得できます。 リーリーPrinciple が ULID を保存するだけではない理由はわかりませんが、現在の動作ではプロジェクトで ULID を使用することが妨げられません。 お役に立てれば!