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