Doctrine orm 原则2.5查询日志记录:未知列类型;2“;请求

Doctrine orm 原则2.5查询日志记录:未知列类型;2“;请求,doctrine-orm,Doctrine Orm,为这个冗长的问题道歉 我有一个基于ZF3的应用程序,它使用条令 我试图将发送到MySQL服务器的“最终”查询记录到应用程序日志中。为此,我实现了一个基于的解决方案 注意:我知道ZF Debug Bar,但如果需要,我需要将查询记录到应用程序日志以进行生产调试 但是,在某些情况下,记录器会出现致命错误: Unknown column type "2" requested. Any Doctrine type that you use has to be registered with \Doctr

为这个冗长的问题道歉

我有一个基于ZF3的应用程序,它使用条令

我试图将发送到MySQL服务器的“最终”查询记录到应用程序日志中。为此,我实现了一个基于的解决方案

注意:我知道ZF Debug Bar,但如果需要,我需要将查询记录到应用程序日志以进行生产调试

但是,在某些情况下,记录器会出现致命错误:

Unknown column type "2" requested. Any Doctrine type that you use has to be registered with \Doctrine\DBAL\Types\Type::addType(). You can get a list of all the known types with \Doctrine\DBAL\Types\Type::getTypesMap(). If this error occurs during database introspection then you might have forgot to register all database types for a Doctrine Type. Use AbstractPlatform#registerDoctrineTypeMapping() or have your custom types implement Type#getMappedDatabaseTypes(). If the type name is empty you might have a problem with the cache or forgot some mapping information.
奇怪的是,错误仅出现在记录器中-如果禁用记录器,查询将正常执行

我的实现如下所示(我使用UUID作为主键):

“条令”=>[
“配置”=>[
“orm_默认值”=>[
“类型”=>[
UuidType::NAME=>UuidType::class
],
'sql_logger'=>DoctrineLog::class
]
],
]
类DoctrineLog扩展了调试堆栈
{
公共函数startQuery($sql,数组$params=null,数组$types=null){
父::startQuery($sql、$params、$types);
//如果没有设置参数,只需按原样记录查询
if(空($params)){
调试('Executing query:',$sql,;');
返回;
}
$convertedSql=str_replace('?','%s',$sql);
$convertedParams=[];
foreach($params作为$index=>$param){
$type=type::getType($types[$index]);
$value=$type->convertToDatabaseValue($param,self::$dbPlatform);
$convertedParams[]=var_导出($value,true);
}
Log::debug('Executing query:',sprintf($convertedSql,$convertedParams),';');
}
}
我进行了一点调查,发现使用
QueryBuilder
构建了一个在记录器中运行时失败的特定查询:

$queryBuilder->select('m')
->from(Mod::class'm')
->其中('m.userId=:userId')
->orderBy('m.dateCreated','desc')
->setParameter('userId',$userId);
如果我使用
findBy
repository方法创建相同的查询,它会正确记录:

$entityManager->getRepository(Mod::class)->findBy(['userId'=>$user->getId()],['dateCreated'=>'desc']);
我已经将其缩小到
DoctrineLog
类中传递给
startQuery
方法的
$types
参数

当查询正确记录时(使用
findBy
repository方法创建时),
$types
数组如下所示:

[
0=>“uuid”
]
当查询无法记录时(使用
QueryBuilder
创建时),
$types
数组如下所示:

[
0 => 2
]
我完全不知道那
2
是什么意思。正如我所说,奇怪的是,无论查询是如何创建的,查询都会成功执行

对于这个特定的查询,我可以转储
QueryBuilder
,但在运行更新查询时也会发生此故障,因此我需要找到原因或找到另一种方法来记录整个查询

任何指点都将不胜感激

注意:
\doctor\DBAL\types\Type::getTypesMap()
返回的
类型列表如下:

[
[array]=>条令\DBAL\Types\ArrayType
[简单数组]=>条令\DBAL\Types\SimpleArrayType
[json_数组]=>Doctrine\DBAL\Types\JsonArrayType
[对象]=>条令\DBAL\Types\ObjectType
[布尔]=>条令\DBAL\Types\BooleanType
[整数]=>条令\DBAL\Types\IntegerType
[smallint]=>条令\DBAL\Types\smallint类型
[bigint]=>条令\DBAL\Types\BigIntType
[string]=>条令\DBAL\Types\StringType
[text]=>条令\DBAL\Types\TextType
[datetime]=>条令\DBAL\Types\DateTimeType
[datetimetz]=>条令\DBAL\Types\DateTimeTzType
[日期]=>条令\DBAL\Types\DateType
[时间]=>条令\DBAL\Types\TimeType
[十进制]=>条令\DBAL\Types\DecimalType
[float]=>条令\DBAL\Types\FloatType
[二进制]=>条令\DBAL\Types\BinaryType
[blob]=>条令\DBAL\Types\BlobType
[guid]=>条令\DBAL\Types\GuidType
[uuid]=>Ramsey\uuid\Doctrine\UuidType
]