Как я могу найти все продукты без изображений в Magento? - PullRequest
7 голосов
/ 25 августа 2010

У меня есть несколько тысяч товаров, и я хочу найти все товары без изображения.Я пытался найти (нет изображения) в сетке продуктов администратора, но безрезультатно.Как я могу сделать запрос SQL, который отключает все эти продукты?

Ответы [ 10 ]

15 голосов
/ 25 августа 2010

Хватит думать в терминах SQL. Начните думать с точки зрения моделей Magento. Модели Magento просто используют SQL в качестве бэкэнда. Запросы для вещей через необработанный SQL возможны, но будут варьироваться от версии к версии Magento и могут отличаться в зависимости от используемого вами бэкенда

Запустите следующее из действия тестового контроллера или из другого места, из которого вы можете выполнить код Magento. Он запрашивает модель для продуктов без изображения

//this builds a collection that's analagous to 
//select * from products where image = 'no_selection'
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('image', 'no_selection');

foreach($products as $product)
{
    echo  $product->getSku() . " has no image \n<br />\n";
    //var_dump($product->getData()); //uncomment to see all product attributes
                                     //remove ->addAttributeToFilter('image', 'no_selection');
                                     //from above to see all images and get an idea of
                                     //the things you may query for
}       
6 голосов
/ 21 мая 2013

Я знаю, что это очень старое, но я нашел это полезным, поэтому я решил опубликовать обновление.

В дополнение к ответу Алана выше, я обнаружил, что есть и другие сценарии, кроме'no_selection' .. может быть из-за плагинов или общих ошибок в системе?Последний nlike на самом деле найдет все, но я оставил остальные просто для удовольствия.

Измените запрос на коллекцию следующим образом:

$products = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSelect('*')
    ->addAttributeToFilter(array(
        array (
            'attribute' => 'image',
            'like' => 'no_selection'
        ),
        array (
            'attribute' => 'image', // null fields
            'null' => true
        ),
        array (
            'attribute' => 'image', // empty, but not null
            'eq' => ''
        ),
        array (
            'attribute' => 'image', // check for information that doesn't conform to Magento's formatting
            'nlike' => '%/%/%'
        ),
    ));
2 голосов
/ 30 марта 2015

Я попробовал все эти ответы в различных комбинациях, и мне вернули только небольшое подмножество моего каталога.Причина: я изначально импортировал свои продукты, используя скрипт импорта изображений на заказ.

Если я не указал изображения для некоторых строк во время импорта, сценарий не создал NULL или пустые значения атрибутов для этих изображений.,Он просто не создавал строки атрибутов вообще.

Поскольку addAttributeToFilter использует объединение INNER по умолчанию и не было значения атрибута изображения для присоединения, размещенные здесь запросы не улавливали эти SKU.

Приведенный ниже код возвращает все продукты, для которых изображение, small_image или миниатюра имеют нулевое значение, неправильно отформатировано, или строка полностью отсутствует .

Третий параметр addAttributeToFilter позволяет вам указать тип объединения, который будет использоваться вместе с предложениями OR оператора WHERE.

$products = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSelect('*')
    ->addAttributeToFilter(
        array(
            array(
                'attribute' => 'image',
                'null' => '1'
            ),
            array(
                'attribute' => 'small_image',
                'null' => '1'
            ),
            array(
                'attribute' => 'thumbnail',
                'null' => '1'
            ),
            array(
                'attribute' => 'image',
                'nlike' => '%/%/%'
            ),
            array(
                'attribute' => 'small_image',
                'nlike' => '%/%/%'
            ),
            array(
                'attribute' => 'thumbnail',
                'nlike' => '%/%/%'
            )
        ),
        null,
        'left'
    );

Если, как и я, вы хотитечтобы преобразовать это в запрос SQL для экспорта в виде CSV из вашего клиента SQL, просто распечатайте запрос из сценария PHP:

echo $products->getSelect();

Я видел несколько SQL-запросов, опубликованных в StackOverflow, которые жестко кодируют attribute_id целых чисел, которые ссылаются на атрибуты image, small_image и thumbnail, но они могут различаться в зависимости от установки.В Magento запросы с ORM намного лучше, чем с SQL.

1 голос
/ 14 ноября 2011

также, чтобы получить sql, который запрос Алан описывает, работает за кулисами:

echo (string) $products->getSelect();

0 голосов
/ 08 марта 2017

Вы можете использовать этот SQL, чтобы увидеть, у какого продукта нет изображений:

SELECT * FROM catalog_product_entity_media_gallery RIGHT OUTER JOIN catalog_product_entity ON catalog_product_entity.entity_id = catalog_product_entity_media_gallery.entity_id WHERE catalog_product_entity_media_gallery.value is NULL

Удачи!

0 голосов
/ 03 марта 2017

Я пробовал все, но это работает для меня, когда плоский каталог включен

$products = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSelect('*')
    ->addAttributeToFilter(
        array(
            array(
                'attribute' => 'image',
                'null' => '1'
            ),
            array(
                'attribute' => 'small_image',
                'null' => '1'
            ),
            array(
                'attribute' => 'thumbnail',
                'null' => '1'
            ),
            array(
                'attribute' => 'image',
                'nlike' => '%/%/%'
            ),
            array(
                'attribute' => 'small_image',
                'nlike' => '%/%/%'
            ),
            array(
                'attribute' => 'thumbnail',
                'nlike' => '%/%/%'
            )
        ),
        null,
        'left'
    );
0 голосов
/ 09 февраля 2015

Я только хочу добавить, что ответ Шона Мишо является правильным, за исключением того, что нам не нужно использовать это

array (
        'attribute' => 'image', // null fields
        'null' => true
    ),

Используя эту страницу: http://bytes.com/topic/sql-server/answers/83267-wildcard-doesnt-match-using-like-varchar-field-wierd

«Значение NULL не совпадает со строкой нулевой длины. NULL представляет отсутствие какого-либо значения, а стандарт SQL говорит, что значение NULL никогда не равно любому другому значению, включая другое NULL»

Таким образом, %/%/% не получит значения NULL, но добавив код сверху, мы исправим ошибку и получим поля изображения со значениями NULL.Это результат

$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(array(
    array (
        'attribute' => 'image', // null fields
        'null' => true
    ),
    array (
        'attribute' => 'image', // check for information that doesn't conform to Magento's formatting
        'nlike' => '%/%/%'
    ),
));

Если вы хотите работать со всеми атрибутами изображения, код может выглядеть следующим образом

$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(array(
        array (
            'attribute' => 'image', //Check for information that doesn't conform to Magento's formatting
            'nlike' => '%/%/%'
        ),
        array (
            'attribute' => 'small_image', //Check for information that doesn't conform to Magento's formatting
            'nlike' => '%/%/%'
        ),
        array (
            'attribute' => 'thumbnail', //Check for information that doesn't conform to Magento's formatting
            'nlike' => '%/%/%'
        ),
        array (
            'attribute' => 'image', //Check for null fields
            'null' => true
        ),
        array (
            'attribute' => 'small_image', //Check for null fields
            'null' => true
        ),
        array (
            'attribute' => 'thumbnail', //Check for null fields
            'null' => true
        ),
));
0 голосов
/ 02 мая 2014

для продукта без малого изображения попробуйте это

select * from catalog_product_entity_varchar WHERE attribute_id = 86 AND value = 'no_selection'

найти attribute_id в таблице eav_attribute

0 голосов
/ 17 апреля 2013

Есть два способа сделать:

$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('small_image',array('notnull'=>'','neq'=>'no_selection'));

Над кодом должен работать, но в моем случае он не работал. Поэтому я попробовал следующее:

$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('small_image',array('neq'=>'no_selection'));

Удачи!

0 голосов
/ 25 августа 2010

Некоторое время назад я написал статью в блоге с SQL-запросом, чтобы найти пропущенные изображения. Это не отключает продукты, но это, по крайней мере, начало: http://prattski.com/2010/06/29/magento-sql-to-find-missing-images/. Это должно быть довольно легко сделать с этого момента. Возможно, вам придется изменить идентификатор атрибута, если ваш совпадает с моим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...