From 70addc55ca875556620589ae19a1c0514adf2d52 Mon Sep 17 00:00:00 2001 From: "Jonathan.Wage" Date: Thu, 29 Nov 2007 15:57:05 +0000 Subject: [PATCH] Fixes to model building so it does not generate duplicate relations. --- lib/Doctrine/Import/Schema.php | 35 ++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/Doctrine/Import/Schema.php b/lib/Doctrine/Import/Schema.php index c24dbdd17..1a622fded 100644 --- a/lib/Doctrine/Import/Schema.php +++ b/lib/Doctrine/Import/Schema.php @@ -212,7 +212,24 @@ class Doctrine_Import_Schema */ public function getRelations($properties) { - return isset($this->_relations[$properties['className']]) ? $this->_relations[$properties['className']]:array(); + $allRelations = isset($this->_relations[$properties['className']]) ? $this->_relations[$properties['className']]:array(); + + // This is for checking for duplicates between alias-relations and a auto-generated relations to ensure the result set of unique relations + $existingRelations = array(); + $uniqueRelations = array(); + foreach ($allRelations as $relation) { + if ( ! in_array($relation['key'], $existingRelations)) { + $existingRelations[] = $relation['key']; + $uniqueRelations = array_merge($uniqueRelations, array($relation['alias'] => $relation)); + } else { + // check to see if this relationship is not autogenerated, if it's not, then the user must have explicitly declared it + if (!isset($relation['autogenerated']) || $relation['autogenerated'] != true) { + $uniqueRelations = array_merge($uniqueRelations, array($relation['alias'] => $relation)); + } + } + } + + return $uniqueRelations; } /** @@ -376,7 +393,7 @@ class Doctrine_Import_Schema * @param string $array * @return void */ - protected function _buildRelationships(&$array) + protected function _buildRelationships($array) { foreach ($array as $name => $properties) { if ( ! isset($properties['relations'])) { @@ -415,6 +432,8 @@ class Doctrine_Import_Schema $relation['foreignType'] = $relation['foreignType'] === 'one' ? Doctrine_Relation::ONE:Doctrine_Relation::MANY; } + $relation['key'] = $this->_buildUniqueRelationKey($relation); + $this->_relations[$className][$alias] = $relation; } } @@ -456,9 +475,21 @@ class Doctrine_Import_Schema } if (!isset($this->_relations[$relation['class']][$newRelation['alias']])) { + $newRelation['key'] = $this->_buildUniqueRelationKey($newRelation); $this->_relations[$relation['class']][$newRelation['alias']] = $newRelation; } } } } + + /** + * _buildUniqueRelationKey + * + * @param string $relation + * @return void + */ + protected function _buildUniqueRelationKey($relation) + { + return md5($relation['local'].$relation['foreign'].$relation['class'].(isset($relation['refClass']) ? $relation['refClass']:null)); + } } \ No newline at end of file