我为Uuid定义了一个自定义Doctrine数据类型。当我使用find($uuid)
搜索对象时,它可以正常工作,即在执行查询之前使用convertToDatabaseValue()
转换属性,并在检索到值时使用convertToPhpValue()
转换回来。
如果我使用QueryBuilder,转换不起作用。例如:
$qb = $this->createQueryBuilder('s');
$qb = $qb->where( //some conditions...
$qb->expr()->eq( 's.uuid', ':uuid' ))->setParameter( 'uuid', $uuid );
我发现了两个类似的未回答的问题:
看起来转换实际上已被忽略。
如何在执行查询之前强制转换参数?有没有办法从存储库中访问自定义数据类型的convertToDatabaseValue()
函数?
由于
答案 0 :(得分:1)
这里是解决方案:函数setParameter()
有第三个参数$type
,用于声明参数的类型。可以使用Doctrine Type类的getType()
函数检索自定义声明的类型:
$qb = $this->createQueryBuilder('s');
$qb = $qb->where( //some conditions...
$qb->expr()->eq( 's.uuid', ':uuid' ))->setParameter( 'uuid', $uuid, Type::getType('uuid') );
答案 1 :(得分:1)
是setParameter()
有第三个参数,但第三个参数的类型为字符串对我而言不是对象。
您可以通过以下方式完成。
$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');