public function loadMetadataForClass($className, ClassMetadataInfo $metadata)
{
if (!$metadata->reflClass instanceof SchemaReflection) {
$metadata->reflClass = new SchemaReflection(get_class($metadata));
}
$metadata->primaryTable['name'] = $className::meta('source');
$primaryKey = $className::meta('key');
$bindings = static::bindings($className);
$relations = array();
if (!empty($bindings)) {
foreach ($bindings as $type => $set) {
foreach ($set as $key => $relation) {
$mapping = array('fetch' => \Doctrine\ORM\Mapping\AssociationMapping::FETCH_EAGER, 'fieldName' => $relation['fieldName'], 'sourceEntity' => $className, 'targetEntity' => $relation['class'], 'mappedBy' => null, 'cascade' => !empty($relation['dependent']) ? array('remove') : array(), 'optional' => $type != 'belongsTo');
if (in_array($type, array('hasOne', 'hasMany'))) {
$inverse = $type == 'belongsTo';
$mapping['joinColumns'][] = array('fieldName' => !$inverse ? $relation['key'] : $relation['fieldName'], 'name' => !$inverse ? $relation['fieldName'] : $relation['key'], 'referencedColumnName' => $relation['class']::meta('key'));
}
if (in_array($type, array('belongsTo', 'hasOne', 'hasMany'))) {
$mapping['mappedBy'] = static::_fieldName($mapping);
}
$relations[$type][$key] = $mapping;
}
}
}
$schema = (array) $className::schema();
$metadata->reflClass->setRelations($relations);
$metadata->reflClass->setSchema($schema);
$belongsToFields = !empty($bindings['belongsTo']) ? Set::combine(array_values($bindings['belongsTo']), '/key', '/fieldName') : array();
foreach ($schema as $field => $column) {
$mapping = array_merge(array('id' => $field == $primaryKey, 'fieldName' => !empty($belongsToFields[$field]) ? $belongsToFields[$field] : $field, 'columnName' => $field), (array) $column);
$metadata->mapField($mapping);
if ($mapping['id']) {
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_AUTO);
}
}
foreach ($relations as $type => $set) {
foreach ($set as $key => $mapping) {
$metadata->{static::$_bindingMapping[$type]}($mapping);
$mapping = $metadata->associationMappings[$mapping['fieldName']];
}
}
}