Skip to main content
    $mainImage = $this->imageQueryResource->getProductMainImage($productId);
    
            $firstImage = $this->imageQueryResource->getFirstImages($productId);
            $output->writeln('first image' . $firstImage);
    
            if ($mainImage != $firstImage) {
                $output->writeln('fix product ' . $mainImage . ' product id: ' . $productId);
                $otherImages = $this->imageQueryResource->getAllImages($productId);
                foreach ($otherImages as $image) {
                    $position = 1;
    
             
        if ($image['value'] == $mainImage) {
                        $this->imageQueryResource->updatePosition((int)$image['value_id'], $position);
                    }
                }
    
                reset($otherImages);
                foreach ($otherImages as $image) {
                    if ($image['value'] != $mainImage) {
                        $position++;
                        $this->imageQueryResource->updatePosition((int)$image['value_id'], $position);
                    }
                }
            }
    $mainImage = $this->imageQueryResource->getProductMainImage($productId);
    
            $firstImage = $this->imageQueryResource->getFirstImages($productId);
            $output->writeln('first image' . $firstImage);
    
            if ($mainImage != $firstImage) {
                $output->writeln('fix product ' . $mainImage . ' product id: ' . $productId);
                $otherImages = $this->imageQueryResource->getAllImages($productId);
                foreach ($otherImages as $image) {
                    $position = 1;
    
                    if ($image['value'] == $mainImage) {
                        $this->imageQueryResource->updatePosition((int)$image['value_id'], $position);
                    }
                }
    
                reset($otherImages);
                foreach ($otherImages as $image) {
                    if ($image['value'] != $mainImage) {
                        $position++;
                        $this->imageQueryResource->updatePosition((int)$image['value_id'], $position);
                    }
                }
            }
$mainImage = $this->imageQueryResource->getProductMainImage($productId);
    
$firstImage = $this->imageQueryResource->getFirstImages($productId);
$output->writeln('first image' . $firstImage);
    
if ($mainImage != $firstImage) {
    $output->writeln('fix product ' . $mainImage . ' product id: ' . $productId);
    $otherImages = $this->imageQueryResource->getAllImages($productId);
    foreach ($otherImages as $image) {
        $position = 1;
         
        if ($image['value'] == $mainImage) {
            $this->imageQueryResource->updatePosition((int)$image['value_id'], $position);
        }
    }
    
    reset($otherImages);
    foreach ($otherImages as $image) {
         if ($image['value'] != $mainImage) {
             $position++;
             $this->imageQueryResource->updatePosition((int)$image['value_id'], $position);
         }
    }
}
Bounty Ended with 100 reputation awarded by JGeer
Source Link
Herve Tribouilloy
  • 7.8k
  • 2
  • 14
  • 28

the snippet below is the steps to follow to resolve your issue

    $mainImage = $this->imageQueryResource->getProductMainImage($productId);
    
            $firstImage = $this->imageQueryResource->getFirstImages($productId);
            $output->writeln('first image' . $firstImage);
    
            if ($mainImage != $firstImage) {
                $output->writeln('fix product ' . $mainImage . ' product id: ' . $productId);
                $otherImages = $this->imageQueryResource->getAllImages($productId);
                foreach ($otherImages as $image) {
                    $position = 1;
    
                    if ($image['value'] == $mainImage) {
                        $this->imageQueryResource->updatePosition((int)$image['value_id'], $position);
                    }
                }
    
                reset($otherImages);
                foreach ($otherImages as $image) {
                    if ($image['value'] != $mainImage) {
                        $position++;
                        $this->imageQueryResource->updatePosition((int)$image['value_id'], $position);
                    }
                }
            }

the file below does the query and update for your images.

<?php

namespace Mbs\ImageSorting\Model;

use Magento\Framework\App\ResourceConnection;

class ImageQueryResource
{
    /**
     * @var ResourceConnection
     */
    private $resourceConnection;
    /**
     * @var \Magento\Eav\Model\Config
     */
    private $config;

    public function __construct(
        ResourceConnection $resourceConnection,
        \Magento\Eav\Model\Config $config
    ) {
        $this->resourceConnection = $resourceConnection;
        $this->config = $config;
    }

    public function getProductMainImage(int $productId)
    {
        $mainImageAttribute = $this->config->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'image');

        $select = $this->resourceConnection->getConnection()->select();
        $select->from($this->resourceConnection->getTableName('catalog_product_entity_' . $mainImageAttribute->getBackendType()));
        $select->where('entity_id=?', $productId);
        $select->where('attribute_id=?', $mainImageAttribute->getId());
        $select->reset(\Magento\Framework\DB\Select::COLUMNS);
        $select->columns(['value']);

        return $this->resourceConnection->getConnection()->fetchOne($select);
    }

    /**
     * @param int $productId
     * select * from catalog_product_entity_media_gallery_value as v
    inner join catalog_product_entity_media_gallery as g on g.value_id=v.value_id
    where entity_id=1802
    order by position
     */
    public function getAllImages(int $productId)
    {
        $select = $this->resourceConnection->getConnection()->select();
        $select->from(['v' => $this->resourceConnection->getTableName('catalog_product_entity_media_gallery_value')]);
        $select->join(
            ['g' => 'catalog_product_entity_media_gallery'],
            'g.value_id=v.value_id',
            []
        );

        $select->where('entity_id=?', $productId);
        $select->reset(\Magento\Framework\DB\Select::COLUMNS);
        $select->columns(['v.value_id', 'v.position', 'g.value']);
        $select->order('v.position');

        return $this->resourceConnection->getConnection()->fetchAll($select);
    }

    /**
     * @param int $productId
     * select * from catalog_product_entity_media_gallery_value as v
    inner join catalog_product_entity_media_gallery as g on g.value_id=v.value_id
    where entity_id=1802
    order by position
     */
    public function getFirstImages(int $productId)
    {
        $select = $this->resourceConnection->getConnection()->select();
        $select->from(['v' => $this->resourceConnection->getTableName('catalog_product_entity_media_gallery_value')]);
        $select->join(
            ['g' => 'catalog_product_entity_media_gallery'],
            'g.value_id=v.value_id',
            []
        );

        $select->where('entity_id=?', $productId);
        $select->reset(\Magento\Framework\DB\Select::COLUMNS);
        $select->columns(['g.value', 'v.position']);
        $select->order('v.position');
        //$select->limit(1);

        $result = $this->resourceConnection->getConnection()->fetchAll($select);

        $minPosition = 2000;
        $position = [];
        $minImage = '';
        foreach ($result as $row) {
            if ($row['position'] < $minPosition) {
                $minPosition = $row['position'];
                $minImage = $row['value'];
                $position[$row['position']] = 1;
            }
        }

        if (count($position) > 1) {
            return $minImage;
        }
    }

    public function updatePosition(int $valueId, int $position)
    {
        $this->resourceConnection->getConnection()->update(
            $this->resourceConnection->getTableName('catalog_product_entity_media_gallery_value'),
            ['position' => $position],
            ['value_id=?' => $valueId]
        );
    }

}