migrations/Version20260120145848.php line 1

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace DoctrineMigrations;
  4. use Doctrine\DBAL\Schema\Schema;
  5. use Doctrine\Migrations\AbstractMigration;
  6. final class Version20260120145848 extends AbstractMigration
  7. {
  8.     public function getDescription(): string
  9.     {
  10.         return 'Add unique constraint for sku per shop';
  11.     }
  12.     public function preUp(Schema $schema): void
  13.     {
  14.         $this->handleDuplicateSkus();
  15.     }
  16.     public function up(Schema $schema): void
  17.     {
  18.         $this->addSql('CREATE UNIQUE INDEX sku_shop ON product (shop_id, sku)');
  19.     }
  20.     public function down(Schema $schema): void
  21.     {
  22.         $this->addSql('DROP INDEX sku_shop ON `product`');
  23.     }
  24.     private function handleDuplicateSkus(): void
  25.     {
  26.         $sql 'SELECT shop_id, sku, COUNT(*) as count 
  27.                 FROM product 
  28.                 WHERE product.sku IS NOT NULL AND product.sku != ""
  29.                 GROUP BY shop_id, sku 
  30.                 HAVING count > 1';
  31.         $duplicates $this->connection->fetchAllAssociative($sql);
  32.         foreach ($duplicates as $duplicate) {
  33.             $shopId $duplicate['shop_id'];
  34.             $sku $duplicate['sku'];
  35.             $sql "SELECT id FROM product WHERE product.shop_id = ? AND product.sku = ? ORDER BY product.id LIMIT 18446744073709551615 OFFSET 1";
  36.             $products $this->connection->fetchAllAssociative($sql, [$shopId$sku]);
  37.             foreach ($products as $index => $product) {
  38.                 $newSku $sku $index;
  39.                 $this->addSql('UPDATE product SET product.sku = ? WHERE product.id = ?', [$newSku$product['id']]);
  40.             }
  41.            
  42.         }
  43.     }
  44. }