symfony 应用程序中 UUID v4 转换的问题

问题描述 投票:0回答:1

堆栈溢出社区,

当使用 Doctrine 从数据库获取相关实体时,我在 Symfony 应用程序中遇到 UUID 版本 4 处理问题。尽管将我的实体配置为使用 UUID 作为标识符并确保我的数据库支持它,但我仍然遇到转换问题。

问题描述:

从使用字符串标识符转换为实体 ID 的 UUID (v4) 后,我遇到了一个持续存在的问题,即 Doctrine 似乎错误地处理了 UUID 转换,特别是在获取相关实体时。该错误表现为 Doctrine 使用类似二进制格式的 UUID 生成查询(例如,

0x546970E77A10401388351FA21F92E31A
),由于格式不匹配,该查询与任何记录都不匹配。

最显着的影响是尝试在我的

getEmailsTo()
实体上使用
EmailFormType
方法来检索关联的
EmailTo
实体时。该方法返回空值,表示没有找到记录,可能是由于 UUID 格式问题。

相关代码片段:

  1. EmailFormType实体(简体):

    #[ORM\Entity(repositoryClass: EmailFormTypeRepository::class)]
    #[ORM\Table(name: 'WORKSPACE_EMAIL_FORM_TYPE')]
    class EmailFormType {
        #[ORM\Id]
        #[ORM\Column(name:"id", type: UuidType::NAME, unique: true, nullable: false)]
        #[ORM\GeneratedValue(strategy: 'CUSTOM')]
        #[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')]
        private Uuid $id;
        // Other properties and methods...
        /**
          * @var Collection
        */
        #[ORM\OneToMany(mappedBy: 'emailFormType', targetEntity: EmailTo::class)]
        private Collection $emailsTo;
         /**
          *
          */
          public function __construct()
          {
             $this->emailsTo = new ArrayCollection();
          }
        public function getEmailsTo(): Collection
        {
         return $this->emailsTo;
        }
    }
    
  2. 获取电子邮件功能:

    public function getFormattedEmails(EmailFormType $emailFormType, string $type): string {
        return implode(';', $emailFormType->getEmailsTo()
            ->filter(fn(EmailTo $emailTo) => $emailTo->getType() === $type)
            ->map(fn(EmailTo $emailTo) => $emailTo->getEmail())
            ->toArray());
    }
    

我的ORACLE数据库中的字段:

ID --- VARCHAR2(100)

已执行的请求:

SELECT t0.id AS ID_1, t0.email AS EMAIL_2, t0.type AS TYPE_3, t0.email_form_type_id AS EMAIL_FORM_TYPE_ID_4 FROM WORKSPACE_EMAIL_TO t0 WHERE t0.email_form_type_id = 0x546970E77A10401388351FA21F92E31A;

有关此事的任何帮助或指导将不胜感激!

symfony doctrine uuid custom-type
1个回答
0
投票

我在尝试维护 ORACLE 数据库中的实体 ID 字段的

VARCHAR2(100)
类型时遇到了问题,以下是我在确保正确处理 UUID 的同时解决该问题的方法:

  1. 创建自定义类型:我创建了一个自定义字段类型来处理 UUID。
  2. 配置更新:我将此自定义类型添加到我的
    doctrine.yaml
    配置中。
  3. 实体修改:我更新了我的实体以利用此自定义字段类型。

这是代表我的自定义字段类型的类:

<?php

namespace App\Doctrine;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;
use Symfony\Component\Uid\Uuid;

class CustomUuidType extends Type
{
    public function convertToDatabaseValue($value, AbstractPlatform $platform): mixed
    {
        return $value instanceof Uuid ? $value->toRfc4122() : $value;
    }

    // Ensure this method can return null for nullable fields
    public function convertToPHPValue($value, AbstractPlatform $platform): ?Uuid
    {
        return $value === null ? null : Uuid::fromString($value);
    }

    public function getName(): string
    {
        return 'custom_uuid';
    }

    public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
    {
        return $platform->getColumnDeclarationSQL('varchar', $column);
    }
}

修改

doctrine.yaml
文件:

doctrine:
    dbal:
        types:
            custom_uuid: App\Doctrine\CustomUuidType

我的实体设置:

#[ORM\Entity(repositoryClass: EmailFormTypeRepository::class)]
#[ORM\Table(name: 'WORKSPACE_EMAIL_FORM_TYPE')]
class EmailFormType
{
    #[ORM\Id]
    #[ORM\Column(name:"id", type:"custom_uuid", length: 100, unique: true, nullable: false)]
    #[ORM\GeneratedValue(strategy: 'CUSTOM')]
    #[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')]
    private Uuid $id;

    #[ORM\OneToMany(mappedBy: 'emailFormType', targetEntity: EmailTo::class)]
    private Collection $emailsTo;

    public function __construct()
    {
        $this->emailsTo = new ArrayCollection();
    }

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

    public function getEmailsTo(): Collection
    {
        return $this->emailsTo;
    }
}

通过这些更改,Doctrine 现在可以正确执行查询,并对 UUID 进行正确的转换处理:

SELECT t0.id AS ID_1, t0.email AS EMAIL_2, t0.type AS TYPE_3, t0.email_form_type_id AS EMAIL_FORM_TYPE_ID_4 FROM WORKSPACE_EMAIL_TO t0 WHERE t0.email_form_type_id = ?
Parameters:
[
  "546970e7-7a10-4013-8835-1fa21f92e31a"
]

此设置可确保我的应用程序在数据库中正确处理 UUID 作为

VARCHAR2(100)
,同时利用 Symfony 强大的 Doctrine ORM 功能。

© www.soinside.com 2019 - 2024. All rights reserved.