diff --git a/DataFixtures/Loader/AbstractDataLoader.php b/DataFixtures/Loader/AbstractDataLoader.php index 010ffe4..0dd2f6d 100644 --- a/DataFixtures/Loader/AbstractDataLoader.php +++ b/DataFixtures/Loader/AbstractDataLoader.php @@ -257,8 +257,7 @@ abstract class AbstractDataLoader extends AbstractDataHandler implements DataLoa $reflectionClass = new \ReflectionClass($parentClass); if (!$reflectionClass->isAbstract()) { - $parentObj = new $parentClass; - $parentObj->fromArray($obj->toArray()); + $parentObj = $obj->getParentOrCreate(); $this->saveParentReference($parentClass, $key, $parentObj); } @@ -267,6 +266,24 @@ abstract class AbstractDataLoader extends AbstractDataHandler implements DataLoa } } + /** + * Retrieve all the parent classes of a given class (for the inheritance). + * + * @param string $class Class name of the current object + */ + protected function getInheritedClasses($class) { + $reflectionClass = new \ReflectionClass($class); + $classes = array(); + + while (!$reflectionClass->isAbstract()) { + $classes[] = constant(constant($class.'::PEER').'::TABLE_NAME'); + $class = get_parent_class(get_parent_class($class)); + $reflectionClass = new \ReflectionClass($class); + } + + return $classes; + } + /** * Loads many to many objects. * @@ -278,11 +295,11 @@ abstract class AbstractDataLoader extends AbstractDataHandler implements DataLoa { $middleTable = $this->dbMap->getTable($middleTableName); $middleClass = $middleTable->getClassname(); - $tableName = constant(constant(get_class($obj).'::PEER').'::TABLE_NAME'); + $inheritedClasses = $this->getInheritedClasses(get_class($obj)); foreach ($middleTable->getColumns() as $column) { if ($column->isForeignKey()) { - if ($tableName !== $column->getRelatedTableName()) { + if (!in_array($column->getRelatedTableName(), $inheritedClasses)) { $relatedClass = $this->dbMap->getTable($column->getRelatedTableName())->getClassname(); $relatedSetter = 'set' . $column->getRelation()->getName(); } else { diff --git a/Tests/DataFixtures/Loader/YamlDataLoaderTest.php b/Tests/DataFixtures/Loader/YamlDataLoaderTest.php index 890bb38..0755346 100644 --- a/Tests/DataFixtures/Loader/YamlDataLoaderTest.php +++ b/Tests/DataFixtures/Loader/YamlDataLoaderTest.php @@ -379,6 +379,81 @@ YAML; $this->assertInstanceOf('Propel\PropelBundle\Tests\Fixtures\DataFixtures\Loader\YamlInheritedRelationshipAuthor', $author); } + public function testLoadWithInheritedManyToManyRelationship() + { + $schema = << + + + + +
+ + + + + +
+ + + + +
+ + + + + + +
+ + + + + + + + + + +
+ + +XML; + + $fixtures = <<getTempFile($fixtures); + + $builder = new \PropelQuickBuilder(); + $builder->setSchema($schema); + $con = $builder->build(); + + $loader = new YamlDataLoader(__DIR__.'/../../Fixtures/DataFixtures/Loader'); + $loader->load(array($filename), 'default'); + + $authors = \Propel\PropelBundle\Tests\Fixtures\DataFixtures\Loader\YamlInheritedM2MRelationshipNobelizedAuthorPeer::doSelect(new \Criteria(), $con); + $this->assertCount(1, $authors); + + $author = $authors[0]; + $books = $author->getBooks(); + $this->assertCount(2, $books); + } + public function testLoadArrayToObjectType() { $schema = <<