|
@@ -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;
|
|
|
+ }
|
|
|
}
|