Doctrine\ORM\Tools\SchemaTool::_gatherRelationJoinColumns PHP Method

_gatherRelationJoinColumns() private method

Gather columns and fk constraints that are required for one part of relationship.
private _gatherRelationJoinColumns ( array $joinColumns, Doctrine\DBAL\Schema\Table $theJoinTable, Doctrine\ORM\Mapping\ClassMetadata $class, Doctrine\ORM\Mapping\AssociationMapping $mapping, array &$primaryKeyColumns, array &$uniqueConstraints )
$joinColumns array
$theJoinTable Doctrine\DBAL\Schema\Table
$class Doctrine\ORM\Mapping\ClassMetadata
$mapping Doctrine\ORM\Mapping\AssociationMapping
$primaryKeyColumns array
$uniqueConstraints array
    private function _gatherRelationJoinColumns($joinColumns, $theJoinTable, $class, $mapping, &$primaryKeyColumns, &$uniqueConstraints)
    {
        $localColumns = array();
        $foreignColumns = array();
        $fkOptions = array();

        foreach ($joinColumns as $joinColumn) {
            $columnName = $joinColumn['name'];
            $referencedFieldName = $class->getFieldName($joinColumn['referencedColumnName']);

            if ( ! $class->hasField($referencedFieldName)) {
                throw new \Doctrine\ORM\ORMException(
                    "Column name `".$joinColumn['referencedColumnName']."` referenced for relation from ".
                    $mapping['sourceEntity'] . " towards ". $mapping['targetEntity'] . " does not exist."
                );
            }

            $primaryKeyColumns[] = $columnName;
            $localColumns[] = $columnName;
            $foreignColumns[] = $joinColumn['referencedColumnName'];

            if ( ! $theJoinTable->hasColumn($joinColumn['name'])) {
                // Only add the column to the table if it does not exist already.
                // It might exist already if the foreign key is mapped into a regular
                // property as well.

                $fieldMapping = $class->getFieldMapping($referencedFieldName);

                $columnDef = null;
                if (isset($joinColumn['columnDefinition'])) {
                    $columnDef = $joinColumn['columnDefinition'];
                } else if (isset($fieldMapping['columnDefinition'])) {
                    $columnDef = $fieldMapping['columnDefinition'];
                }
                $columnOptions = array('notnull' => false, 'columnDefinition' => $columnDef);
                if (isset($joinColumn['nullable'])) {
                    $columnOptions['notnull'] = !$joinColumn['nullable'];
                }
                if ($fieldMapping['type'] == "string") {
                    $columnOptions['length'] = $fieldMapping['length'];
                } else if ($fieldMapping['type'] == "decimal") {
                    $columnOptions['scale'] = $fieldMapping['scale'];
                    $columnOptions['precision'] = $fieldMapping['precision'];
                }

                $theJoinTable->addColumn(
                    $columnName, $class->getTypeOfColumn($joinColumn['referencedColumnName']), $columnOptions
                );
            }

            if (isset($joinColumn['unique']) && $joinColumn['unique'] == true) {
                $uniqueConstraints[] = array('columns' => array($columnName));
            }

            if (isset($joinColumn['onUpdate'])) {
                $fkOptions['onUpdate'] = $joinColumn['onUpdate'];
            }

            if (isset($joinColumn['onDelete'])) {
                $fkOptions['onDelete'] = $joinColumn['onDelete'];
            }
        }

        $theJoinTable->addUnnamedForeignKeyConstraint(
            $class->getTableName(), $localColumns, $foreignColumns, $fkOptions
        );
    }