Skip to content

Commit

Permalink
BAP-7269: Can't add ManyToOne relation from Contact entity to Country…
Browse files Browse the repository at this point in the history
… entity

 - review fixes
  • Loading branch information
Maksym Perepelytsya committed Feb 26, 2016
1 parent 5fcdc67 commit 9c4cd7b
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 32 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace Oro\Bundle\EntityExtendBundle\Exception;

use Oro\Bundle\EntityBundle\Exception\EntityExceptionInterface;
use Oro\Bundle\EntityBundle\Exception\RuntimeException;

/**
* This exception is thrown when an entity is not valid for extend relation.
*/
class InvalidRelationEntityException extends RuntimeException implements EntityExceptionInterface
{
}
50 changes: 25 additions & 25 deletions src/Oro/Bundle/EntityExtendBundle/ORM/RelationMetadataBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
use Oro\Bundle\EntityConfigBundle\Config\ConfigInterface;
use Oro\Bundle\EntityConfigBundle\Config\ConfigManager;
use Oro\Bundle\EntityConfigBundle\Config\Id\FieldConfigId;

use Oro\Bundle\EntityExtendBundle\Exception\InvalidRelationEntityException;
use Oro\Bundle\EntityExtendBundle\Extend\RelationType;

use Oro\Bundle\EntityExtendBundle\Tools\ExtendConfigDumper;
use Oro\Bundle\EntityExtendBundle\Tools\ExtendDbIdentifierNameGenerator;
use Oro\Bundle\EntityExtendBundle\Tools\ExtendHelper;
Expand Down Expand Up @@ -77,7 +80,7 @@ protected function buildManyToOneRelation(
array $relation
) {
$targetEntity = $relation['target_entity'];
$targetIdColumn = $this->getPrimaryKeyColumn($targetEntity);
$targetIdColumn = $this->getSinglePrimaryKeyColumn($targetEntity);
$cascade = !empty($relation['cascade']) ? $relation['cascade'] : [];
$cascade[] = 'detach';

Expand Down Expand Up @@ -128,12 +131,7 @@ protected function buildOneToManyRelation(
&& RelationType::ONE_TO_MANY === ExtendHelper::getRelationType($relationKey)
&& $this->isDefaultRelationRequired($fieldId)
) {
$this->buildDefaultRelation(
$metadataBuilder,
$fieldId,
$targetEntity,
$this->getPrimaryKeyColumn($targetEntity)
);
$this->buildDefaultRelation($metadataBuilder, $fieldId, $targetEntity);
}
}

Expand All @@ -152,12 +150,7 @@ protected function buildManyToManyRelation(
if ($relation['owner']) {
$this->buildManyToManyOwningSideRelation($metadataBuilder, $fieldId, $relation);
if ($this->isDefaultRelationRequired($fieldId)) {
$this->buildDefaultRelation(
$metadataBuilder,
$fieldId,
$targetEntity,
$this->getPrimaryKeyColumn($targetEntity)
);
$this->buildDefaultRelation($metadataBuilder, $fieldId, $targetEntity);
}
} elseif (!empty($relation['target_field_id'])) {
$this->buildManyToManyTargetSideRelation(
Expand Down Expand Up @@ -193,8 +186,8 @@ protected function buildManyToManyOwningSideRelation(
$fieldId->getFieldName(),
$targetEntity
);
$selfIdColumn = $this->getPrimaryKeyColumn($entityClassName);
$targetIdColumn = $this->getPrimaryKeyColumn($targetEntity);
$selfIdColumn = $this->getSinglePrimaryKeyColumn($entityClassName);
$targetIdColumn = $this->getSinglePrimaryKeyColumn($targetEntity);
$builder->setJoinTable($joinTableName);

if ($selfIdColumn !== 'id') {
Expand Down Expand Up @@ -251,22 +244,23 @@ protected function buildManyToManyTargetSideRelation(
* @param ClassMetadataBuilder $metadataBuilder
* @param FieldConfigId $fieldId
* @param string $targetEntity
* @param string $targetIdColumn
*
*/
protected function buildDefaultRelation(
ClassMetadataBuilder $metadataBuilder,
FieldConfigId $fieldId,
$targetEntity,
$targetIdColumn
$targetEntity
) {
$builder = $metadataBuilder->createManyToOne(
$targetIdColumn = $this->getSinglePrimaryKeyColumn($targetEntity);
$builder = $metadataBuilder->createManyToOne(
ExtendConfigDumper::DEFAULT_PREFIX . $fieldId->getFieldName(),
$targetEntity
);

$builder->addJoinColumn(
$this->nameGenerator->generateRelationDefaultColumnName($fieldId->getFieldName(), '_' . $targetIdColumn),
$this->nameGenerator->generateRelationDefaultColumnName(
$fieldId->getFieldName(),
'_' . $targetIdColumn
),
$targetIdColumn,
true,
false,
Expand Down Expand Up @@ -324,12 +318,18 @@ protected function getFieldConfig(FieldConfigId $fieldId)
*
* @return string
*/
protected function getPrimaryKeyColumn($entityName)
protected function getSinglePrimaryKeyColumn($entityName)
{
$pkColumns = ['id'];
if ($this->configManager->getProvider('extend')->hasConfig($entityName)) {
$config = $this->configManager->getProvider('extend')->getConfig($entityName);
$pkColumns = $config->get('pk_columns', false, $pkColumns);
if ($this->configManager->hasConfig($entityName)) {
$entityConfig = $this->configManager->getEntityConfig('extend', $entityName);
$pkColumns = $entityConfig->get('pk_columns', false, $pkColumns);
if (count($pkColumns) > 1) {
// TODO This restriction should be removed in scope of https://magecore.atlassian.net/browse/BAP-9815
throw new InvalidRelationEntityException(
sprintf('Entity class %s has not single primary key.', $entityName)
);
}
}

return reset($pkColumns);
Expand Down
11 changes: 4 additions & 7 deletions src/Oro/Bundle/EntityExtendBundle/Tools/ExtendConfigLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -128,13 +128,10 @@ protected function loadEntityConfigs(ClassMetadata $metadata, $force)
parent::loadEntityConfigs($metadata, $force);

$className = $metadata->getName();
if ($this->hasEntityConfigs($metadata)) {
if ($this->configManager->getProvider('extend')->hasConfig($className)) {
$configInterface = $this->configManager->getProvider('extend')->getConfig($className);
$configInterface
->set('pk_columns', $metadata->getIdentifierColumnNames());
$this->configManager->persist($configInterface);
}
if ($this->hasEntityConfigs($metadata) && $this->configManager->hasConfig($className)) {
$entityConfig = $this->configManager->getEntityConfig('extend', $className);
$entityConfig->set('pk_columns', $metadata->getIdentifierColumnNames());
$this->configManager->persist($entityConfig);
}
}
}

0 comments on commit 9c4cd7b

Please sign in to comment.