条令/Symfony:在使用QueryBuilder之前将自定义类型转换为数据库值

条令/Symfony:在使用QueryBuilder之前将自定义类型转换为数据库值,symfony,doctrine,Symfony,Doctrine,我已经为Uuid定义了一个自定义的条令数据类型。当我使用find($uuid)搜索对象时,它工作正常,即在执行查询之前使用convertToDatabaseValue()转换属性,在检索值时使用convertopHPValue()转换回属性 如果使用QueryBuilder,转换将不起作用。例如: $qb = $this->createQueryBuilder('s'); $qb = $qb->where( //some conditions... $qb->exp

我已经为Uuid定义了一个自定义的条令数据类型。当我使用
find($uuid)
搜索对象时,它工作正常,即在执行查询之前使用
convertToDatabaseValue()
转换属性,在检索值时使用
convertopHPValue()
转换回属性

如果使用QueryBuilder,转换将不起作用。例如:

$qb = $this->createQueryBuilder('s');
$qb = $qb->where( //some conditions...
      $qb->expr()->eq( 's.uuid', ':uuid' ))->setParameter( 'uuid', $uuid );
我发现了两个类似的未回答问题:

看起来转换实际上被忽略了

如何在执行查询之前强制转换参数?是否有方法从存储库访问自定义数据类型的
convertToDatabaseValue()
函数


谢谢

解决方案如下:函数
setParameter()
有第三个参数
$type
,用于声明参数的类型。可以使用条令类型类的
getType()
函数检索自定义声明的类型:

$qb = $this->createQueryBuilder('s');
$qb = $qb->where( //some conditions...
      $qb->expr()->eq( 's.uuid', ':uuid' ))->setParameter( 'uuid', $uuid, Type::getType('uuid') );
setParameter()
有第三个参数,但第三个参数的类型为string是为我而不是对象工作的

你可以用下面的方法来做

$qb = $this->createQueryBuilder('s');
$qb = $qb->where( //some conditions...
      $qb->expr()->eq( 's.uuid', ':uuid' ))->setParameter( 'uuid', $uuid, 'uuid' );
如果您不知道数据类型“uuid”的确切密钥是什么。 然后使用
print\r(Type::getTypesMap())
以获取添加的所有数据类型的列表

在我的情况下是这样的

Array
(
    [array] => Doctrine\DBAL\Types\ArrayType
    [simple_array] => Doctrine\DBAL\Types\SimpleArrayType
    [json_array] => Doctrine\DBAL\Types\JsonArrayType
    [object] => Doctrine\DBAL\Types\ObjectType
    [boolean] => Doctrine\DBAL\Types\BooleanType
    [integer] => Doctrine\DBAL\Types\IntegerType
    [smallint] => Doctrine\DBAL\Types\SmallIntType
    [bigint] => Doctrine\DBAL\Types\BigIntType
    [string] => Doctrine\DBAL\Types\StringType
    [text] => Doctrine\DBAL\Types\TextType
    [datetime] => Doctrine\DBAL\Types\DateTimeType
    [datetimetz] => Doctrine\DBAL\Types\DateTimeTzType
    [date] => Doctrine\DBAL\Types\DateType
    [time] => Doctrine\DBAL\Types\TimeType
    [decimal] => Doctrine\DBAL\Types\DecimalType
    [float] => Doctrine\DBAL\Types\FloatType
    [binary] => Doctrine\DBAL\Types\BinaryType
    [blob] => Doctrine\DBAL\Types\BlobType
    [guid] => Doctrine\DBAL\Types\GuidType    
    [geometry] => CrEOF\Spatial\DBAL\Types\GeometryType
    [point] => CrEOF\Spatial\DBAL\Types\Geometry\PointType
    [polygon] => CrEOF\Spatial\DBAL\Types\Geometry\PolygonType
    [linestring] => CrEOF\Spatial\DBAL\Types\Geometry\LineStringType
)
我的教条是这样的

$queryBuilder = $this->createQueryBuilder('c');
        $queryBuilder
            ->where('st_contains(:polygon, point(c.latitude, c.longitude) ) = 1')
            ->setParameter('polygon', $city->getPolygon(), 'polygon');