原则 2.5 查询日志记录:请求的未知列类型"2"



对这个长问题表示歉意。

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

我正在尝试将发送到MySQL服务器的"最终"查询记录到应用程序日志中。为此,我实现了一个基于这个特定答案的解决方案。

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

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

Unknown column type "2" requested. Any Doctrine type that you use has to be registered with DoctrineDBALTypesType::addType(). You can get a list of all the known types with DoctrineDBALTypesType::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作为主键):

'doctrine' => [
'configuration' => [
'orm_default' => [
'types' => [
UuidType::NAME => UuidType::class
],
'sql_logger' => DoctrineLog::class
]
],
]

class DoctrineLog extends DebugStack
{
public function startQuery($sql, array $params = null, array $types = null) {
parent::startQuery($sql, $params, $types);
// If there are no parameters set, just log the query as-is
if (empty($params)) {
Log::debug('Executing query: ', $sql, ';');
return;
}
$convertedSql = str_replace('?', '%s', $sql);
$convertedParams = [];
foreach ($params as $index => $param) {
$type = Type::getType($types[$index]);
$value = $type->convertToDatabaseValue($param, self::$dbPlatform);
$convertedParams[] = var_export($value, true);
}
Log::debug('Executing query: ', sprintf($convertedSql, ...$convertedParams), ';');
}
}

我调查了一下,发现在通过记录器运行时失败的一个特定查询是使用QueryBuilder:构建的

$queryBuilder->select('m')
->from(Mod::class, 'm')
->where('m.userId = :userId')
->orderBy('m.dateCreated', 'desc')
->setParameter('userId', $userId);

如果我使用findBy存储库方法创建相同的查询,它会正确记录:

$entityManager->getRepository(Mod::class)->findBy(['userId' => $user->getId()], ['dateCreated' => 'desc']);

我已经将它缩小到传递给DoctrineLog类中的startQuery方法的$types参数。

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

[
0 => 'uuid'
]

当查询无法记录时(使用QueryBuilder创建时),$types数组如下所示:

[
0 => 2
]

我完全不知道2应该是什么意思。正如我所说,奇怪的是查询执行成功,而不管它是如何创建的。

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

任何建议都将不胜感激。

注:DoctrineDBALTypesType::getTypesMap()返回的types列表如下:

[
[array] => DoctrineDBALTypesArrayType
[simple_array] => DoctrineDBALTypesSimpleArrayType
[json_array] => DoctrineDBALTypesJsonArrayType
[object] => DoctrineDBALTypesObjectType
[boolean] => DoctrineDBALTypesBooleanType
[integer] => DoctrineDBALTypesIntegerType
[smallint] => DoctrineDBALTypesSmallIntType
[bigint] => DoctrineDBALTypesBigIntType
[string] => DoctrineDBALTypesStringType
[text] => DoctrineDBALTypesTextType
[datetime] => DoctrineDBALTypesDateTimeType
[datetimetz] => DoctrineDBALTypesDateTimeTzType
[date] => DoctrineDBALTypesDateType
[time] => DoctrineDBALTypesTimeType
[decimal] => DoctrineDBALTypesDecimalType
[float] => DoctrineDBALTypesFloatType
[binary] => DoctrineDBALTypesBinaryType
[blob] => DoctrineDBALTypesBlobType
[guid] => DoctrineDBALTypesGuidType
[uuid] => RamseyUuidDoctrineUuidType
]

我收到了完全相同的错误消息。最终,我发现我为ClassMetadataBuilder->addField( 'trace', ParameterType::STRING );传递的一个实体的类型实际上是"2"(ParameterType::STRING)。确保使用DoctrineDBALTypesTypes中的类型(如Types::uuid),或者至少定义一个自己喜欢的类型,在错误中声明。

最新更新