Example #1
0
 /**
  * Gathers the SQL for properly setting up the relations of the given class.
  * This includes the SQL for foreign key constraints and join tables.
  * 
  * @param ClassMetadata $class
  * @param \Doctrine\DBAL\Schema\Table $table
  * @param \Doctrine\DBAL\Schema\Schema $schema
  * @return void
  */
 private function _gatherRelationsSql($class, $table, $schema)
 {
     foreach ($class->associationMappings as $fieldName => $mapping) {
         if (isset($class->inheritedAssociationFields[$fieldName])) {
             continue;
         }
         $foreignClass = $this->_em->getClassMetadata($mapping->targetEntityName);
         if ($mapping->isOneToOne() && $mapping->isOwningSide) {
             $primaryKeyColumns = $uniqueConstraints = array();
             // unnecessary for this relation-type
             $this->_gatherRelationJoinColumns($mapping->getJoinColumns(), $table, $foreignClass, $mapping, $primaryKeyColumns, $uniqueConstraints);
         } else {
             if ($mapping->isOneToMany() && $mapping->isOwningSide) {
                 //... create join table, one-many through join table supported later
                 throw DoctrineException::notSupported();
             } else {
                 if ($mapping->isManyToMany() && $mapping->isOwningSide) {
                     // create join table
                     $joinTable = $mapping->getJoinTable();
                     $theJoinTable = $schema->createTable($mapping->getQuotedJoinTableName($this->_platform));
                     $primaryKeyColumns = $uniqueConstraints = array();
                     // Build first FK constraint (relation table => source table)
                     $this->_gatherRelationJoinColumns($joinTable['joinColumns'], $theJoinTable, $class, $mapping, $primaryKeyColumns, $uniqueConstraints);
                     // Build second FK constraint (relation table => target table)
                     $this->_gatherRelationJoinColumns($joinTable['inverseJoinColumns'], $theJoinTable, $foreignClass, $mapping, $primaryKeyColumns, $uniqueConstraints);
                     foreach ($uniqueConstraints as $indexName => $unique) {
                         $theJoinTable->addUniqueIndex($unique['columns'], is_numeric($indexName) ? null : $indexName);
                     }
                     $theJoinTable->setPrimaryKey($primaryKeyColumns);
                 }
             }
         }
     }
 }