Doctrine orm 原则2.5查询日志记录:未知列类型;2“;请求
为这个冗长的问题道歉 我有一个基于ZF3的应用程序,它使用条令 我试图将发送到MySQL服务器的“最终”查询记录到应用程序日志中。为此,我实现了一个基于的解决方案 注意:我知道ZF Debug Bar,但如果需要,我需要将查询记录到应用程序日志以进行生产调试 但是,在某些情况下,记录器会出现致命错误: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
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
]