public static function loadMetadata(ClassMetadata $metadata) { $builder = new ClassMetadataBuilder($metadata); $builder->createField('id', 'integer')->isPrimaryKey()->generatedValue()->build(); $builder->addField('title', 'string'); $builder->addOneToMany('songs', 'Song', 'album'); $builder->addInverseManyToMany('performers', 'Performer', 'albums'); }
/** * Insert enabled widgets in base widget DiscriminatorMap * * @param LoadClassMetadataEventArgs $eventArgs */ public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs) { $metadata = $eventArgs->getClassMetadata(); //set a relation between Page and User to define the page author $metaBuilder = new ClassMetadataBuilder($metadata); //Add author relation on view if ($this->userClass && $metadata->name === 'Victoire\\Bundle\\CoreBundle\\Entity\\View') { $metadata->mapManyToOne(array('fieldName' => 'author', 'targetEntity' => $this->userClass, 'cascade' => array('persist'), 'inversedBy' => 'pages', 'joinColumns' => array(array('name' => 'author_id', 'referencedColumnName' => 'id', 'onDelete' => 'SET NULL')))); } // if $pages property exists, add the inversed side on User if ($metadata->name === $this->userClass && property_exists($this->userClass, 'pages')) { $metaBuilder->addOneToMany('pages', 'Victoire\\Bundle\\PageBundle\\Entity\\View', 'author'); } }
/** * Insert enabled widgets in base widget add relationship between BusinessEntities and EntityProxy * @param LoadClassMetadataEventArgs $eventArgs */ public static function loadClassMetadata($eventArgs) { //this functions is called during the extract of translations //but the argument is not the same //so to avoid an error during extractions, we test the argument if ($eventArgs instanceof LoadClassMetadataEventArgs) { $annotationReader = self::$annotationReader; $metadatas = $eventArgs->getClassMetadata(); if ($metadatas->name === 'Victoire\\Bundle\\CoreBundle\\Entity\\EntityProxy') { foreach ($annotationReader->getBusinessClasses() as $field => $entity) { if (!$metadatas->hasAssociation($field)) { $metadatas->mapManyToOne(array('fieldName' => $field, 'targetEntity' => $entity, 'cascade' => array('persist'), 'inversedBy' => 'proxies')); } } } // Test if the current entity is a businessEntity $key = array_search($metadatas->name, $annotationReader->getBusinessClasses()); // If so, and if proxies relation has already been injected (by a parent BusinessEntity) if ($key && !$metadatas->hasAssociation('proxies')) { $metaBuilder = new ClassMetadataBuilder($metadatas); $metaBuilder->addOneToMany('proxies', 'Victoire\\Bundle\\CoreBundle\\Entity\\EntityProxy', $key); } } }
/** * Loads the metadata for the specified class into the provided container. * * @param string $className * @param ClassMetadata $metadata */ function loadMetadataForClass($className, ClassMetadata $metadata) { $moduleOptions = \SoliantEntityAudit\Module::getModuleOptions(); $entityManager = $moduleOptions->getEntityManager(); $metadataFactory = $entityManager->getMetadataFactory(); $builder = new ClassMetadataBuilder($metadata); if ($className == 'SoliantEntityAudit\\Entity\\RevisionEntity') { $builder->createField('id', 'integer')->isPrimaryKey()->generatedValue()->build(); $builder->addManyToOne('revision', 'SoliantEntityAudit\\Entity\\Revision', 'revisionEntities'); $builder->addField('entityKeys', 'string'); $builder->addField('auditEntityClass', 'string'); $builder->addField('targetEntityClass', 'string'); $builder->addField('revisionType', 'string'); $builder->addField('title', 'string', array('nullable' => true)); $metadata->setTableName($moduleOptions->getRevisionEntityTableName()); return; } // Revision is managed here rather than a separate namespace and driver if ($className == 'SoliantEntityAudit\\Entity\\Revision') { $builder->createField('id', 'integer')->isPrimaryKey()->generatedValue()->build(); $builder->addField('comment', 'text', array('nullable' => true)); $builder->addField('timestamp', 'datetime'); // Add association between RevisionEntity and Revision $builder->addOneToMany('revisionEntities', 'SoliantEntityAudit\\Entity\\RevisionEntity', 'revision'); // Add assoication between User and Revision $userMetadata = $metadataFactory->getMetadataFor($moduleOptions->getUserEntityClassName()); $builder->createManyToOne('user', $userMetadata->getName())->addJoinColumn('user_id', $userMetadata->getSingleIdentifierColumnName())->build(); $metadata->setTableName($moduleOptions->getRevisionTableName()); return; } # $builder->createField('audit_id', 'integer')->isPrimaryKey()->generatedValue()->build(); $identifiers = array(); # $metadata->setIdentifier(array('audit_id')); // Build a discovered many to many join class $joinClasses = $moduleOptions->getJoinClasses(); if (in_array($className, array_keys($joinClasses))) { $builder->createField('id', 'integer')->isPrimaryKey()->generatedValue()->build(); $builder->addManyToOne('targetRevisionEntity', 'SoliantEntityAudit\\Entity\\RevisionEntity'); $builder->addManyToOne('sourceRevisionEntity', 'SoliantEntityAudit\\Entity\\RevisionEntity'); $metadata->setTableName($moduleOptions->getTableNamePrefix() . $joinClasses[$className]['joinTable']['name'] . $moduleOptions->getTableNameSuffix()); // $metadata->setIdentifier($identifiers); return; } // Get the entity this entity audits $metadataClassName = $metadata->getName(); $metadataClass = new $metadataClassName(); $auditedClassMetadata = $metadataFactory->getMetadataFor($metadataClass->getAuditedEntityClass()); try { $builder->addManyToOne($moduleOptions->getRevisionEntityFieldName(), 'SoliantEntityAudit\\Entity\\RevisionEntity'); } catch (MappingException $e) { // do nothing } // Compound keys removed in favor of auditId (audit_id) $identifiers[] = $moduleOptions->getRevisionEntityFieldName(); // Add fields from target to audit entity foreach ($auditedClassMetadata->getFieldNames() as $fieldName) { $fieldMapping = $auditedClassMetadata->getFieldMapping($fieldName); if (!isset($fieldMapping['inherited']) && !isset($fieldMapping['declared'])) { $fieldMapping['nullable'] = true; $fieldMapping['quoted'] = true; $builder->addField($fieldName, $auditedClassMetadata->getTypeOfField($fieldName), $fieldMapping); } if ($auditedClassMetadata->isIdentifier($fieldName)) { $identifiers[] = $fieldName; } } foreach ($auditedClassMetadata->getAssociationMappings() as $mapping) { if (!isset($mapping['inherited']) && !isset($mapping['declared'])) { if (!$mapping['isOwningSide']) { continue; } if (isset($mapping['joinTable'])) { continue; } if (isset($mapping['joinTableColumns'])) { foreach ($mapping['joinTableColumns'] as $field) { $builder->addField($mapping['fieldName'], 'integer', array('nullable' => true, 'columnName' => $field)); } } elseif (isset($mapping['joinColumnFieldNames'])) { foreach ($mapping['joinColumnFieldNames'] as $field) { $builder->addField($mapping['fieldName'], 'integer', array('nullable' => true, 'columnName' => $field)); } } else { throw new \Exception('Unhandled association mapping'); } } } if ($auditedClassMetadata->isInheritanceTypeJoined() || $auditedClassMetadata->isInheritanceTypeSingleTable()) { $metadata->setInheritanceType($auditedClassMetadata->inheritanceType); $metadata->setDiscriminatorColumn($auditedClassMetadata->discriminatorColumn); $parentAuditClasses = array(); $subAuditClasses = array(); foreach ($auditedClassMetadata->parentClasses as $idx => $parentClass) { $parentAuditClass = 'SoliantEntityAudit\\Entity\\' . str_replace('\\', '_', $parentClass); $parentAuditClasses[$idx] = $parentAuditClass; } $metadata->setParentClasses($parentAuditClasses); foreach ($auditedClassMetadata->subClasses as $idx => $subClass) { $subAuditClass = 'SoliantEntityAudit\\Entity\\' . str_replace('\\', '_', $subClass); $subAuditClasses[$idx] = $subAuditClass; } $metadata->setSubClasses($subAuditClasses); foreach ($auditedClassMetadata->discriminatorMap as $mapName => $mapClass) { $mapAuditClass = 'SoliantEntityAudit\\Entity\\' . str_replace('\\', '_', $mapClass); $metadata->addDiscriminatorMapClass($mapName, $mapAuditClass); } } $metadata->setPrimaryTable(array('name' => $moduleOptions->getTableNamePrefix() . $auditedClassMetadata->getTableName() . $moduleOptions->getTableNameSuffix())); $metadata->setIdentifier($identifiers); return; }
/** * Loads the metadata for the specified class into the provided container. * * @param string $className * @param ClassMetadata $metadata */ function loadMetadataForClass($className, ClassMetadata $metadata) { $moduleOptions = \ZF\Doctrine\Audit\Module::getModuleOptions(); $entityManager = $moduleOptions->getEntityManager(); $metadataFactory = $entityManager->getMetadataFactory(); $builder = new ClassMetadataBuilder($metadata); if ($className == 'ZF\\Doctrine\\Audit\\Entity\\RevisionEntity') { $builder->createField('id', 'integer')->isPrimaryKey()->generatedValue()->build(); $builder->addManyToOne('revision', 'ZF\\Doctrine\\Audit\\Entity\\Revision', 'revisionEntities'); $builder->addField('entityKeys', 'string'); $builder->addField('auditEntityClass', 'string'); $builder->addField('targetEntityClass', 'string'); $builder->addField('revisionType', 'string'); $builder->addField('title', 'string', array('nullable' => true)); $metadata->setTableName($moduleOptions->getRevisionEntityTableName()); return; } // Revision is managed here rather than a separate namespace and driver if ($className == 'ZF\\Doctrine\\Audit\\Entity\\Revision') { $builder->createField('id', 'integer')->isPrimaryKey()->generatedValue()->build(); $builder->addField('comment', 'text', array('nullable' => true)); $builder->addField('timestamp', 'datetime'); // Add association between RevisionEntity and Revision $builder->addOneToMany('revisionEntities', 'ZF\\Doctrine\\Audit\\Entity\\RevisionEntity', 'revision'); // Add assoication between User and Revision $userMetadata = $metadataFactory->getMetadataFor($moduleOptions->getUserEntityClassName()); $builder->createManyToOne('user', $userMetadata->getName())->addJoinColumn('user_id', $userMetadata->getSingleIdentifierColumnName())->build(); $metadata->setTableName($moduleOptions->getRevisionTableName()); return; } # $builder->createField('audit_id', 'integer')->isPrimaryKey()->generatedValue()->build(); $identifiers = array(); # $metadata->setIdentifier(array('audit_id')); // Build a discovered many to many join class $joinClasses = $moduleOptions->getJoinClasses(); if (in_array($className, array_keys($joinClasses))) { $builder->createField('id', 'integer')->isPrimaryKey()->generatedValue()->build(); $builder->addManyToOne('targetRevisionEntity', 'ZF\\Doctrine\\Audit\\Entity\\RevisionEntity'); $builder->addManyToOne('sourceRevisionEntity', 'ZF\\Doctrine\\Audit\\Entity\\RevisionEntity'); $metadata->setTableName($moduleOptions->getTableNamePrefix() . $joinClasses[$className]['joinTable']['name'] . $moduleOptions->getTableNameSuffix()); // $metadata->setIdentifier($identifiers); return; } // Get the entity this entity audits $metadataClassName = $metadata->getName(); $metadataClass = new $metadataClassName(); $auditedClassMetadata = $metadataFactory->getMetadataFor($metadataClass->getAuditedEntityClass()); $builder->addManyToOne($moduleOptions->getRevisionEntityFieldName(), 'ZF\\Doctrine\\Audit\\Entity\\RevisionEntity'); # Compound keys removed in favor of auditId (audit_id) $identifiers[] = $moduleOptions->getRevisionEntityFieldName(); // Add fields from target to audit entity foreach ($auditedClassMetadata->getFieldNames() as $fieldName) { $builder->addField($fieldName, $auditedClassMetadata->getTypeOfField($fieldName), array('nullable' => true, 'quoted' => true)); if ($auditedClassMetadata->isIdentifier($fieldName)) { $identifiers[] = $fieldName; } } foreach ($auditedClassMetadata->getAssociationMappings() as $mapping) { if (!$mapping['isOwningSide']) { continue; } if (isset($mapping['joinTable'])) { continue; } if (isset($mapping['joinTableColumns'])) { foreach ($mapping['joinTableColumns'] as $field) { $builder->addField($mapping['fieldName'], 'integer', array('nullable' => true, 'columnName' => $field)); } } elseif (isset($mapping['joinColumnFieldNames'])) { foreach ($mapping['joinColumnFieldNames'] as $field) { $builder->addField($mapping['fieldName'], 'integer', array('nullable' => true, 'columnName' => $field)); } } else { throw new \Exception('Unhandled association mapping'); } } $metadata->setTableName($moduleOptions->getTableNamePrefix() . $auditedClassMetadata->getTableName() . $moduleOptions->getTableNameSuffix()); $metadata->setIdentifier($identifiers); return; }
public function build(ClassMetadataBuilder $builder) { $builder->addOneToMany($this->association->getComputedTargetPropertyName(), $this->association->getSourceEntity()->getName(), $this->association->getComputedInversedByPropertyName()); }