堆栈溢出社区,
当使用 Doctrine 从数据库获取相关实体时,我在 Symfony 应用程序中遇到 UUID 版本 4 处理问题。尽管将我的实体配置为使用 UUID 作为标识符并确保我的数据库支持它,但我仍然遇到转换问题。
问题描述:
从使用字符串标识符转换为实体 ID 的 UUID (v4) 后,我遇到了一个持续存在的问题,即 Doctrine 似乎错误地处理了 UUID 转换,特别是在获取相关实体时。该错误表现为 Doctrine 使用类似二进制格式的 UUID 生成查询(例如,
0x546970E77A10401388351FA21F92E31A
),由于格式不匹配,该查询与任何记录都不匹配。
最显着的影响是尝试在我的
getEmailsTo()
实体上使用 EmailFormType
方法来检索关联的 EmailTo
实体时。该方法返回空值,表示没有找到记录,可能是由于 UUID 格式问题。
相关代码片段:
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;
}
}
获取电子邮件功能:
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;
有关此事的任何帮助或指导将不胜感激!
我在尝试维护 ORACLE 数据库中的实体 ID 字段的
VARCHAR2(100)
类型时遇到了问题,以下是我在确保正确处理 UUID 的同时解决该问题的方法:
doctrine.yaml
配置中。这是代表我的自定义字段类型的类:
<?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 功能。