[DoctrineBundle] Fixed bug in data:load when purging many-to-many relationships

This commit is contained in:
Brandon Turner 2010-08-13 14:06:44 -05:00 committed by Fabien Potencier
parent 2731979d21
commit 935ac5633c

View File

@ -13,6 +13,7 @@ use Doctrine\Common\Cli\Configuration;
use Doctrine\Common\Cli\CliController as DoctrineCliController;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Internal\CommitOrderCalculator;
use Doctrine\ORM\Mapping\ClassMetadata;
/*
* This file is part of the Symfony framework.
@ -142,15 +143,26 @@ EOT
$classes[] = $metadata;
}
}
$cmf = $em->getMetadataFactory();
$classes = $this->getCommitOrder($em, $classes);
for ($i = count($classes) - 1; $i >= 0; --$i) {
$class = $classes[$i];
if ($cmf->hasMetadataFor($class->name)) {
try {
$em->createQuery('DELETE FROM '.$class->name.' a')->execute();
} catch (Exception $e) {}
$commitOrder = $this->getCommitOrder($em, $classes);
// Drop association tables first
$orderedTables = $this->getAssociationTables($commitOrder);
// Drop tables in reverse commit order
for ($i = count($commitOrder) - 1; $i >= 0; --$i) {
$class = $commitOrder[$i];
if (($class->isInheritanceTypeSingleTable() && $class->name != $class->rootEntityName)
|| $class->isMappedSuperclass) {
continue;
}
$orderedTables[] = $class->getTableName();
}
foreach($orderedTables as $tbl) {
$em->getConnection()->executeUpdate("DELETE FROM $tbl");
}
}
@ -177,4 +189,19 @@ EOT
return $calc->getCommitOrder();
}
protected function getAssociationTables(array $classes)
{
$associationTables = array();
foreach ($classes as $class) {
foreach ($class->associationMappings as $assoc) {
if ($assoc['isOwningSide'] && $assoc['type'] == ClassMetadata::MANY_TO_MANY) {
$associationTables[] = $assoc['joinTable']['name'];
}
}
}
return $associationTables;
}
}