Resolve issues with images positions while upgrading the sylius database to 2.0

This commit is contained in:
Kamil Grygierzec 2024-10-21 13:20:51 +02:00
parent 538a9f32af
commit 42c6328394
No known key found for this signature in database
GPG key ID: 7F54EE42DAD4B9E9
3 changed files with 44 additions and 3 deletions

View file

@ -20,12 +20,28 @@ final class Version20241020131510 extends AbstractMigration
{
public function getDescription(): string
{
return 'Add position field to ProductImage entity';
return 'Add position field to ProductImage entity and set positions for existing images.';
}
public function up(Schema $schema): void
{
$this->addSql('ALTER TABLE sylius_product_image ADD position INT NOT NULL');
$this->addSql('SET @row_number = 0;');
$this->addSql('CREATE TEMPORARY TABLE IF NOT EXISTS image_count_per_product AS
SELECT sylius_product_image.owner_id, sylius_product_image.id AS image_id
FROM sylius_product_image
ORDER BY sylius_product_image.owner_id, sylius_product_image.id');
$this->addSql('UPDATE sylius_product_image
JOIN (
SELECT owner_id, image_id, (@row_number := IF(@current_product = owner_id, @row_number + 1, 0)) AS position, @current_product := owner_id
FROM image_count_per_product
) AS ranked_images ON ranked_images.image_id = sylius_product_image.id
SET sylius_product_image.position = ranked_images.position');
$this->addSql('DROP TEMPORARY TABLE image_count_per_product;');
}
public function down(Schema $schema): void

View file

@ -20,12 +20,36 @@ final class Version20241020131533 extends AbstractPostgreSQLMigration
{
public function getDescription(): string
{
return 'Add position field to ProductImage entity';
return 'Add position field to ProductImage entity and set positions for existing images.';
}
public function up(Schema $schema): void
{
$this->addSql('ALTER TABLE sylius_product_image ADD position INT NOT NULL');
$this->addSql('ALTER TABLE sylius_product_image ADD position INT DEFAULT 0');
$this->addSql('CREATE TEMPORARY TABLE image_variants_count AS
SELECT sylius_product_image.id AS image_id, sylius_product_variant.product_id, COUNT(sylius_product_variant.id) AS variant_count
FROM sylius_product_image
JOIN sylius_product_image_product_variants AS piv ON sylius_product_image.id = piv.image_id
JOIN sylius_product_variant ON piv.variant_id = sylius_product_variant.id
GROUP BY sylius_product_image.id, sylius_product_variant.product_id'
);
$this->addSql('WITH ranked_images AS (
SELECT sylius_product_image.id AS image_id,
sylius_product_image.owner_id,
ROW_NUMBER() OVER (PARTITION BY sylius_product_image.owner_id ORDER BY sylius_product_image.id) - 1 AS position_rank
FROM sylius_product_image
)
UPDATE sylius_product_image
SET position = ranked_images.position_rank
FROM ranked_images
WHERE sylius_product_image.id = ranked_images.image_id'
);
$this->addSql('ALTER TABLE sylius_product_image ALTER COLUMN position SET NOT NULL');
$this->addSql('DROP TABLE image_variants_count');
}
public function down(Schema $schema): void

View file

@ -19,6 +19,7 @@
<mapped-superclass name="Sylius\Component\Core\Model\ProductImage" table="sylius_product_image">
<many-to-one field="owner" target-entity="Sylius\Component\Product\Model\ProductInterface" inversed-by="images">
<join-column name="owner_id" referenced-column-name="id" nullable="false" on-delete="CASCADE"/>
<gedmo:sortable-group />
</many-to-one>
<many-to-many field="productVariants" target-entity="Sylius\Component\Product\Model\ProductVariantInterface" inversed-by="images">
<order-by>