Skip to content

Commit

Permalink
Introduced JoinColumnMetadataBuilder.
Browse files Browse the repository at this point in the history
  • Loading branch information
guilhermeblanco committed Jul 3, 2019
1 parent 99b7d1e commit 6971e74
Show file tree
Hide file tree
Showing 8 changed files with 352 additions and 185 deletions.
98 changes: 98 additions & 0 deletions lib/Doctrine/ORM/Mapping/Builder/JoinColumnMetadataBuilder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
<?php

declare(strict_types=1);

namespace Doctrine\ORM\Mapping\Builder;

use Doctrine\ORM\Annotation;
use Doctrine\ORM\Mapping;
use function assert;
use function strtoupper;

class JoinColumnMetadataBuilder
{
/** @var Mapping\ClassMetadataBuildingContext */
private $metadataBuildingContext;

/** @var Mapping\ClassMetadata */
private $componentMetadata;

/** @var string */
private $fieldName;

/** @var Annotation\JoinColumn|null */
private $joinColumnAnnotation;

public function __construct(Mapping\ClassMetadataBuildingContext $metadataBuildingContext)
{
$this->metadataBuildingContext = $metadataBuildingContext;
}

public function withComponentMetadata(Mapping\ClassMetadata $componentMetadata) : JoinColumnMetadataBuilder
{
$this->componentMetadata = $componentMetadata;

return $this;
}

public function withFieldName(string $fieldName) : JoinColumnMetadataBuilder
{
$this->fieldName = $fieldName;

return $this;
}

public function withJoinColumnAnnotation(?Annotation\JoinColumn $joinColumnAnnotation) : JoinColumnMetadataBuilder
{
$this->joinColumnAnnotation = $joinColumnAnnotation;

return $this;
}

public function build() : Mapping\JoinColumnMetadata
{
// Validate required fields
assert($this->componentMetadata !== null);
assert($this->fieldName !== null);

$componentClassName = $this->componentMetadata->getClassName();
$namingStrategy = $this->metadataBuildingContext->getNamingStrategy();
$joinColumnMetadata = new Mapping\JoinColumnMetadata();

if (! $this->componentMetadata->isMappedSuperclass) {
$joinColumnMetadata->setTableName($this->componentMetadata->getTableName());
}

$joinColumnMetadata->setColumnName($namingStrategy->joinColumnName($this->fieldName, $componentClassName));
$joinColumnMetadata->setReferencedColumnName($namingStrategy->referenceColumnName());

if ($this->joinColumnAnnotation === null) {
return $joinColumnMetadata;
}

$joinColumnMetadata->setNullable($this->joinColumnAnnotation->nullable);
$joinColumnMetadata->setUnique($this->joinColumnAnnotation->unique);

if (! empty($this->joinColumnAnnotation->name)) {
$joinColumnMetadata->setColumnName($this->joinColumnAnnotation->name);
}

if (! empty($this->joinColumnAnnotation->referencedColumnName)) {
$joinColumnMetadata->setReferencedColumnName($this->joinColumnAnnotation->referencedColumnName);
}

if (! empty($this->joinColumnAnnotation->fieldName)) {
$joinColumnMetadata->setAliasedName($this->joinColumnAnnotation->fieldName);
}

if (! empty($this->joinColumnAnnotation->columnDefinition)) {
$joinColumnMetadata->setColumnDefinition($this->joinColumnAnnotation->columnDefinition);
}

if ($this->joinColumnAnnotation->onDelete) {
$joinColumnMetadata->setOnDelete(strtoupper($this->joinColumnAnnotation->onDelete));
}

return $joinColumnMetadata;
}
}
48 changes: 48 additions & 0 deletions lib/Doctrine/ORM/Mapping/Builder/JoinTableMetadataBuilder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

declare(strict_types=1);

namespace Doctrine\ORM\Mapping\Builder;

use Doctrine\ORM\Annotation;
use Doctrine\ORM\Mapping;
use function assert;

class JoinTableMetadataBuilder
{
/** @var Mapping\ClassMetadataBuildingContext */
private $metadataBuildingContext;

/** @var Mapping\ClassMetadata */
private $entityClassMetadata;

/** @var Annotation\JoinTable|null */
private $tableAnnotation;

public function __construct(Mapping\ClassMetadataBuildingContext $metadataBuildingContext)
{
$this->metadataBuildingContext = $metadataBuildingContext;
}

public function withEntityClassMetadata(Mapping\ClassMetadata $entityClassMetadata) : JoinTableMetadataBuilder
{
$this->entityClassMetadata = $entityClassMetadata;

return $this;
}

public function withTableAnnotation(?Annotation\Table $tableAnnotation) : JoinTableMetadataBuilder
{
$this->tableAnnotation = $tableAnnotation;

return $this;
}

public function build() : Mapping\JoinTableMetadata
{
// Validate required fields
assert($this->entityClassMetadata !== null);

$namingStrategy = $this->metadataBuildingContext->getNamingStrategy();
}
}
60 changes: 0 additions & 60 deletions lib/Doctrine/ORM/Mapping/ClassMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -615,11 +615,6 @@ protected function validateAndCompleteToOneAssociationMetadata(ToOneAssociationM
$fieldName = $property->getName();

if ($property->isOwningSide()) {
if (empty($property->getJoinColumns())) {
// Apply default join column
$property->addJoinColumn(new JoinColumnMetadata());
}

$uniqueConstraintColumns = [];

foreach ($property->getJoinColumns() as $joinColumn) {
Expand All @@ -634,16 +629,6 @@ protected function validateAndCompleteToOneAssociationMetadata(ToOneAssociationM
}
}

$joinColumn->setTableName(! $this->isMappedSuperclass ? $this->getTableName() : null);

if (! $joinColumn->getColumnName()) {
$joinColumn->setColumnName($this->namingStrategy->joinColumnName($fieldName, $this->className));
}

if (! $joinColumn->getReferencedColumnName()) {
$joinColumn->setReferencedColumnName($this->namingStrategy->referenceColumnName());
}

$this->fieldNames[$joinColumn->getColumnName()] = $fieldName;
}

Expand Down Expand Up @@ -684,43 +669,6 @@ protected function validateAndCompleteToOneAssociationMetadata(ToOneAssociationM
}
}

/**
* Validates & completes a to-many association mapping.
*
* @param ToManyAssociationMetadata $property The association mapping to validate & complete.
*
* @throws MappingException
*/
protected function validateAndCompleteToManyAssociationMetadata(ToManyAssociationMetadata $property)
{
// Do nothing
}

/**
* Validates & completes a one-to-one association mapping.
*
* @param OneToOneAssociationMetadata $property The association mapping to validate & complete.
*/
protected function validateAndCompleteOneToOneMapping(OneToOneAssociationMetadata $property)
{
// Do nothing
}

/**
* Validates & completes a many-to-one association mapping.
*
* @param ManyToOneAssociationMetadata $property The association mapping to validate & complete.
*
* @throws MappingException
*/
protected function validateAndCompleteManyToOneMapping(ManyToOneAssociationMetadata $property)
{
// A many-to-one mapping is essentially a one-one backreference
if ($property->isOrphanRemoval()) {
throw MappingException::illegalOrphanRemoval($this->className, $property->getName());
}
}

/**
* Validates & completes a one-to-many association mapping.
*
Expand Down Expand Up @@ -1116,10 +1064,6 @@ public function setTable(TableMetadata $table) : void
{
$this->table = $table;

if (empty($table->getName())) {
$table->setName($this->namingStrategy->classToTableName($this->className));
}

// Make sure inherited and declared properties reflect newly defined table
foreach ($this->properties as $property) {
switch (true) {
Expand Down Expand Up @@ -1199,24 +1143,20 @@ public function addProperty(Property $property) : void
case $property instanceof OneToOneAssociationMetadata:
$this->validateAndCompleteAssociationMapping($property);
$this->validateAndCompleteToOneAssociationMetadata($property);
$this->validateAndCompleteOneToOneMapping($property);
break;

case $property instanceof OneToManyAssociationMetadata:
$this->validateAndCompleteAssociationMapping($property);
$this->validateAndCompleteToManyAssociationMetadata($property);
$this->validateAndCompleteOneToManyMapping($property);
break;

case $property instanceof ManyToOneAssociationMetadata:
$this->validateAndCompleteAssociationMapping($property);
$this->validateAndCompleteToOneAssociationMetadata($property);
$this->validateAndCompleteManyToOneMapping($property);
break;

case $property instanceof ManyToManyAssociationMetadata:
$this->validateAndCompleteAssociationMapping($property);
$this->validateAndCompleteToManyAssociationMetadata($property);
$this->validateAndCompleteManyToManyMapping($property);
break;

Expand Down
Loading

0 comments on commit 6971e74

Please sign in to comment.