[DoctrineBundle] Fixed bug in data:load when purging many-to-many relationships
This commit is contained in:
parent
2731979d21
commit
935ac5633c
@ -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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user