Doctrine orm 如何在dql where语句中使用自定义类型?

Doctrine orm 如何在dql where语句中使用自定义类型?,doctrine-orm,dql,Doctrine Orm,Dql,我在symfony项目中使用了DBAL,并为这些对象创建了自定义DBAL类型。当我将枚举对象保存到数据库时,我会以特殊的字符串格式保存它。myEnumType中的转换函数如下所示: 公共函数convertToDatabaseValue($value,AbstractPlatform$platform) { 如果($value==null){ 返回null; } 返回get_类($value)。'::'.$value->getIndex().::'.$value->getValue(); } 例

我在symfony项目中使用了DBAL,并为这些对象创建了自定义DBAL类型。当我将枚举对象保存到数据库时,我会以特殊的字符串格式保存它。my
EnumType
中的转换函数如下所示:

公共函数convertToDatabaseValue($value,AbstractPlatform$platform)
{
如果($value==null){
返回null;
}
返回get_类($value)。'::'.$value->getIndex().::'.$value->getValue();
}
例如,我有一个事务状态枚举,如下所示:

namespace-App\Enum;
使用Spatie\Enum\Enum;
/**
*@method static self failed()
*@方法静态自挂起()
*@method static self-completed()
*/
最终类TransactionStatus扩展了枚举{}
当我将其保存到数据库时,它可以分别转换为以下任一字符串:

App\Enum\TransactionStatus::0::failed
App\Enum\TransactionStatus::1::pending
App\Enum\TransactionStatus::2::completed
这有助于我的
EnumType
了解要将其转换回的枚举。我之所以在字符串中使用索引号,是因为这有助于排序

现在,这一切都可以很好地获取实体并将其保存到数据库中。但当我尝试在DQL语句的where子句中使用枚举时,它根本不起作用

namespace-App\Repository;
使用App\Entity\Transaction;
使用App\Enum\TransactionStatus;
使用Symfony\Bridge\Doctrine\RegistryInterface;
使用条令\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
类TransactionRepository扩展ServiceEntityRepository
{
公共函数构造(RegistryInterface$registry)
{
父项::_构造($registry,Transaction::class);
}
公共函数findByStatus(TransactionStatus$状态)
{
返回$this->createQueryBuilder('t')
->andWhere('t.status=:status')
->setParameter('status',$status)
->getQuery()->getResult();
}
}
因为出于某种原因,条令忽略了我的转换函数,只使用了Spatiale的枚举中内置的
\uu toString()
函数。因此,条令正在寻找字符串
“pending”
,而不是
“App\Enum\TransactionStatus::1::pending”


如何确保我的枚举总是在DQL where子句中正确转换?

好的,我找到了一种方法,尽管它非常粗糙。我只是从调用
\uu toString()
方法的位置进行检查,如果它是从Doctrine的DBAL调用的,则使用枚举的DB格式

namespace-App\Enum;
使用Spatie\Enum\Enum作为基本枚举;
抽象类Enum扩展了BaseEnum
{
公共函数\uuuToString():字符串
{
if(debug_backtrace()[1]['class']=='PDOStatement'){
返回get_类($this)。“:$this->index:$this->value”;
}
返回父项::_toString();
}
}

好吧,我找到了一种方法,尽管它非常粗糙。我只是从调用
\uu toString()
方法的位置进行检查,如果它是从Doctrine的DBAL调用的,则使用枚举的DB格式

namespace-App\Enum;
使用Spatie\Enum\Enum作为基本枚举;
抽象类Enum扩展了BaseEnum
{
公共函数\uuuToString():字符串
{
if(debug_backtrace()[1]['class']=='PDOStatement'){
返回get_类($this)。“:$this->index:$this->value”;
}
返回父项::_toString();
}
}