Kaynağa Gözat

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

Brandon Turner 15 yıl önce
ebeveyn
işleme
935ac5633c

+ 35 - 8
src/Symfony/Bundle/DoctrineBundle/Command/LoadDataFixturesDoctrineCommand.php

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