{"record":{"id":"fe64574c6cfaeccf","repo":"doctrine/orm","slug":"unknown-class-classname","errorCode":null,"errorMessage":"Unknown class {className}","messagePattern":"Unknown class (.+?)","errorType":"exception","errorClass":"InvalidArgumentException","httpStatus":null,"severity":"error","filePath":"src/Mapping/Driver/DatabaseDriver.php","lineNumber":186,"sourceCode":"     * @param ClassMetadata<T> $metadata\n     *\n     * @template T of object\n     */\n    public function loadMetadataForClass(string $className, PersistenceClassMetadata $metadata): void\n    {\n        if (! $metadata instanceof ClassMetadata) {\n            throw new TypeError(sprintf(\n                'Argument #2 passed to %s() must be an instance of %s, %s given.',\n                __METHOD__,\n                ClassMetadata::class,\n                get_debug_type($metadata),\n            ));\n        }\n\n        $this->reverseEngineerMappingFromDatabase();\n\n        if (! isset($this->classToTableNames[$className])) {\n            throw new InvalidArgumentException('Unknown class ' . $className);\n        }\n\n        $tableName = $this->classToTableNames[$className];\n\n        $metadata->name          = $className;\n        $metadata->table['name'] = $tableName;\n\n        $this->buildIndexes($metadata);\n        $this->buildFieldMappings($metadata);\n        $this->buildToOneAssociationMappings($metadata);\n\n        foreach ($this->manyToManyTables as $manyTable) {\n            foreach ($manyTable->getForeignKeys() as $foreignKey) {\n                // foreign key maps to the table of the current entity, many to many association probably exists\n                if (! (strtolower($tableName) === strtolower(self::getReferencedTableName($foreignKey)))) {\n                    continue;\n                }\n","sourceCodeStart":168,"sourceCodeEnd":204,"githubUrl":"https://github.com/doctrine/orm/blob/d9b9ff73016bf598ae07515f97289ce8074e97a5/src/Mapping/Driver/DatabaseDriver.php#L168-L204","documentation":"DatabaseDriver builds its class-to-table map by reverse engineering the schema: every table name is inflected into a candidate class name (plus explicit setClassNameForTable() overrides and setNamespace() prefixes). loadMetadataForClass() only accepts class names present in that map; any other name throws InvalidArgumentException('Unknown class ...').","triggerScenarios":"Calling loadMetadataForClass('App\\Entity\\User', ...) when the driver derived the class name 'User' (no namespace) from table 'user'; or loading a class whose table was excluded by a schema asset filter; or iterating your own entity list instead of the driver's getAllClassNames().","commonSituations":"Plugging DatabaseDriver into a standard ORM ClassMetadataFactory that walks your configured entity classes; forgetting setNamespace('App\\Entity') / setClassNameForTable() when running orm:convert-mapping --from-database; tables hidden by dbname schema filters.","solutions":["Enumerate loadable classes with $driver->getAllClassNames() instead of your own list.","Make derived names match your classes: call setNamespace('App\\Entity') and/or setClassNameForTable($tableName, $className) before loading metadata.","Check your schema asset filter configuration (FilterSchemaAssetsExpression / schema_assets_filter) — filtered tables never enter classToTableNames."],"exampleFix":"// before\n$driver = new DatabaseDriver($schemaManager);\n$metadata = new ClassMetadata('App\\Entity\\User');\n$driver->loadMetadataForClass('App\\Entity\\User', $metadata); // Unknown class App\\Entity\\User\n\n// after\n$driver = new DatabaseDriver($schemaManager);\n$driver->setNamespace('App\\\\Entity');\n$metadata = new ClassMetadata('App\\Entity\\User');\n$driver->loadMetadataForClass('App\\Entity\\User', $metadata);","handlingStrategy":"validation","validationCode":"$loadable = $driver->getAllClassNames(); // names derived from the actual schema\nif (! in_array($className, $loadable, true)) {\n    throw new InvalidArgumentException(\"{$className} cannot be reverse-engineered; available: \" . implode(', ', $loadable));\n}\n$driver->loadMetadataForClass($className, $metadata);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always drive reverse engineering from getAllClassNames(), not your own entity list.","Call setNamespace()/setClassNameForTable() up front so derived names match your classes.","Audit schema asset filters before converting a database."],"tags":["doctrine-orm","database-driver","reverse-engineering","entity-resolution"],"backgroundTag":"unknown-class-mapping","analyzedSha":"d9b9ff73016bf598ae07515f97289ce8074e97a5","analyzedAt":"2026-08-21T06:13:15.863Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}