2010-08-25 2 views
7

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

+0

@ Майкл Майерс: Почему именно вы отредактировали это почти целый год после его публикации? –

+0

@ Zéychin: Нет никаких ограничений срока действия для редактирования. Каждый раз, когда вы видите что-то, что может быть улучшено, пожалуйста, не стесняйтесь идти вперед и делать это. В этом случае я был здесь, потому что кто-то отправил не-ответ, который я пришел удалить. –

+1

О да, это справедливо. Я просто вижу: отредактировал ... и по тому, как он помещен, кажется, что вы, видимо, отредактировали вопрос, а не удалили (ложный) ответ! Это имеет смысл. Я приветствую вашу работу для этого сообщества. –

ответ

0

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

15

Остановить мышление в терминах SQL. Начните думать с точки зрения моделей Magento. Модели Magento просто используют SQL как бэкэнд. Запрос на вещи через raw 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 
}  
+0

Что делать, если вы хотите, чтобы все продукты С изображениями? – swl1020

+0

@ swl1020 Я не тестировал это, но должен работать стандартный не равный фильтр ('neq'). '' -> addAttributeToFilter ('image', array ("neq" => 'no_selection')); Полный список параметров фильтрации доступен в этой статье: http://alanstorm.com/magento_collections –

+0

Коллекции намного лучше, чем отлаживая самообучающиеся инструкции SQL, необходимые для работы с EAV в любой день недели. Работа уже выполнена для вас, вам нужно только обратить внимание на логику, которую вы используете для работы с результатом. –

1

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

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

0

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

$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')); 

Удачи!

6

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

В дополнение к ответу Алана выше, я обнаружил, что существуют другие сценарии, чем просто «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' => '%/%/%' 
     ), 
    )); 
0

для продукта без малых изображений попробовать этот

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

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

0

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

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 
     ), 
)); 
2

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

Если я не указывал изображения для некоторых строк во время импорта, сценарий не создавал 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.

0

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

$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

Вы можете использовать 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 

удачи!

Смежные вопросы