]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
migrations: fix duplicate violation during lowercase tag migration 3468/head
authorKevin Decherf <kevin@kdecherf.com>
Sun, 10 Dec 2017 18:31:30 +0000 (19:31 +0100)
committerKevin Decherf <kevin@kdecherf.com>
Sun, 10 Dec 2017 18:31:30 +0000 (19:31 +0100)
Signed-off-by: Kevin Decherf <kevin@kdecherf.com>
app/DoctrineMigrations/Version20170719231144.php

index 265b539a88a50e7199af9defabc0438d693d6ce5..9a6f3e938a0f751144715245ad0eca4f89e88f7c 100644 (file)
@@ -31,7 +31,7 @@ class Version20170719231144 extends AbstractMigration implements ContainerAwareI
 
         // Find tags which need to be merged
         $dupTags = $this->connection->query('
-            SELECT LOWER(label)
+            SELECT LOWER(label) AS lower_label
             FROM   ' . $this->getTable('tag') . '
             GROUP BY LOWER(label)
             HAVING COUNT(*) > 1'
@@ -39,17 +39,18 @@ class Version20170719231144 extends AbstractMigration implements ContainerAwareI
         $dupTags->execute();
 
         foreach ($dupTags->fetchAll() as $duplicates) {
-            $label = $duplicates['LOWER(label)'];
+            $label = $duplicates['lower_label'];
 
             // Retrieve all duplicate tags for a given tag
-            $tags = $this->connection->createQuery('
+            $tags = $this->connection->executeQuery('
                 SELECT id
-                FROM   ' . $this->getTable('tag') . "
+                FROM   ' . $this->getTable('tag') . '
                 WHERE  LOWER(label) = :label
-                ORDER BY id ASC"
+                ORDER BY id ASC',
+                [
+                  'label' => $label,
+                ]
             );
-            $tags->setParameter('label', $label);
-            $tags->execute();
 
             $first = true;
             $newId = null;
@@ -71,7 +72,18 @@ class Version20170719231144 extends AbstractMigration implements ContainerAwareI
                 $this->addSql('
                     UPDATE ' . $this->getTable('entry_tag') . '
                     SET    tag_id = ' . $newId . '
-                    WHERE  tag_id IN (' . implode(',', $ids) . ')'
+                    WHERE  tag_id IN (' . implode(',', $ids) . ')
+                        AND entry_id NOT IN (
+                           SELECT entry_id
+                           FROM ' . $this->getTable('entry_tag') . '
+                           WHERE tag_id = ' . $newId . '
+                        )'
+                );
+
+                // Delete links to unused tags
+                $this->addSql('
+                    DELETE FROM ' . $this->getTable('entry_tag') . '
+                    WHERE tag_id IN (' . implode(',', $ids) . ')'
                 );
 
                 // Delete unused tags