<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20260120145848 extends AbstractMigration
{
public function getDescription(): string
{
return 'Add unique constraint for sku per shop';
}
public function preUp(Schema $schema): void
{
$this->handleDuplicateSkus();
}
public function up(Schema $schema): void
{
$this->addSql('CREATE UNIQUE INDEX sku_shop ON product (shop_id, sku)');
}
public function down(Schema $schema): void
{
$this->addSql('DROP INDEX sku_shop ON `product`');
}
private function handleDuplicateSkus(): void
{
$sql = 'SELECT shop_id, sku, COUNT(*) as count
FROM product
WHERE product.sku IS NOT NULL AND product.sku != ""
GROUP BY shop_id, sku
HAVING count > 1';
$duplicates = $this->connection->fetchAllAssociative($sql);
foreach ($duplicates as $duplicate) {
$shopId = $duplicate['shop_id'];
$sku = $duplicate['sku'];
$sql = "SELECT id FROM product WHERE product.shop_id = ? AND product.sku = ? ORDER BY product.id LIMIT 18446744073709551615 OFFSET 1";
$products = $this->connection->fetchAllAssociative($sql, [$shopId, $sku]);
foreach ($products as $index => $product) {
$newSku = $sku . $index;
$this->addSql('UPDATE product SET product.sku = ? WHERE product.id = ?', [$newSku, $product['id']]);
}
}
}
}