]> git.immae.eu Git - github/wallabag/wallabag.git/blobdiff - app/DoctrineMigrations/Version20170719231144.php
Fixed lower case tags migration
[github/wallabag/wallabag.git] / app / DoctrineMigrations / Version20170719231144.php
index 0f5fa75ae527c2708ee2eec30193723ba772e447..867540331f840391e3a6d26b927bc0238ffbae75 100644 (file)
@@ -27,11 +27,11 @@ class Version20170719231144 extends AbstractMigration implements ContainerAwareI
      */
     public function up(Schema $schema)
     {
-        $this->skipIf($this->connection->getDatabasePlatform()->getName() === 'sqlite', 'Migration can only be executed safely on \'mysql\' or \'postgresql\'.');
+        $this->skipIf('sqlite' === $this->connection->getDatabasePlatform()->getName(), 'Migration can only be executed safely on \'mysql\' or \'postgresql\'.');
 
         // 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,16 +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->query('
+            $tags = $this->connection->executeQuery('
                 SELECT id
-                FROM   ' . $this->getTable('tag') . "
-                WHERE  LOWER(label) = '" . $label . "'
-                ORDER BY id ASC"
+                FROM   ' . $this->getTable('tag') . '
+                WHERE  LOWER(label) = :label
+                ORDER BY id ASC',
+                [
+                  'label' => $label,
+                ]
             );
-            $tags->execute();
 
             $first = true;
             $newId = null;
@@ -70,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 (SELECT * FROM ' . $this->getTable('entry_tag') . ') AS _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