2010-08-25 39 views
7

Tengo miles de productos y deseo encontrar todos los productos sin una imagen. Intenté buscar (sin imagen) en la cuadrícula de productos de administrador, pero no obtuve ningún resultado. ¿Cómo puedo hacer una consulta SQL que deshabilite todos estos productos?¿Cómo puedo encontrar todos los productos sin imágenes en Magento?

+0

@Michael Myers: ¿Por qué exactamente editó esto casi un año completo después de su publicación? –

+0

@ Zéychin: no hay un plazo de vigencia para las ediciones. Cada vez que vea algo que podría mejorarse, siéntase libre de seguir adelante y hacerlo. En este caso, estuve aquí porque alguien publicó una no respuesta que vine a eliminar. –

+1

Oh sí, eso es justo. Acabo de ver: editado por ..., y por la forma en que se coloca, parece que aparentemente editó la pregunta, no eliminó la respuesta (falsa). Eso tiene mucho más sentido. Saludo tu trabajo para esta comunidad. –

Respuesta

0

Escribí un artículo de blog hace un tiempo atrás con una consulta sql para encontrar imágenes faltantes. No deshabilita productos, pero es un comienzo al menos: http://prattski.com/2010/06/29/magento-sql-to-find-missing-images/. Debería ser bastante fácil de hacer a partir de este punto. Puede que tenga que cambiar la identificación del atributo si la suya no coincide con la mía.

15

Deje de pensar en términos de SQL. Comienza a pensar en términos de los Modelos de Magento. Los modelos de Magento usan SQL como un backend. Es posible realizar consultas vía SQL sin procesar, pero va a variar de una versión a otra de Magento, y puede diferir dependiendo del back-end que esté utilizando.

Ejecute lo siguiente desde una acción de controlador de prueba o en otro lugar desde el que pueda ejecutar el código de Magento. Se consulta el modelo para productos sin imagen

//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

¿Qué pasa si quieres todos los productos CON imágenes? – swl1020

+0

@ swl1020 No he probado esto, pero un filtro estándar no igual ('neq') debería funcionar. '' -> addAttributeToFilter ('image', array ("neq" => 'no_selection')); 'La lista completa de opciones de filtrado está disponible en este artículo: http://alanstorm.com/magento_collections –

+0

Las colecciones son mucho mejores que depurando las declaraciones de SQL autocompatibles necesarias para trabajar con EAV cualquier día de la semana. El trabajo ya está hecho para ti, solo tienes que prestar atención a la lógica que usas para trabajar con el resultado. –

1

también, para obtener el SQL que la consulta Alan describe corre detrás de las escenas:

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

0

Hay dos maneras de hacerlo:

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

El código anterior debería funcionar, pero en mi caso no funcionaba. Así que traté de seguir:

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

¡Buena suerte!

6

Sé que esto es muy antiguo, pero me pareció útil, así que pensé en publicar una actualización.

Como una adición a la respuesta anterior de Alan, encontré que hay otros escenarios además de la 'no_selection' ... ¿quizás debido a complementos o errores generales en el sistema? El nlike final realmente encontrará todo, pero dejé los otros solo por diversión.

Cambie la consulta de colección de la siguiente manera:

$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

para el producto sin imagen pequeña prueba este

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

hallazgo attribute_id en eav_attribute mesa

0

Yo sólo quiero añadir que la respuesta de Sean Michaud tiene razón, excepto que no necesitamos usar ese

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

El uso de esa página: http://bytes.com/topic/sql-server/answers/83267-wildcard-doesnt-match-using-like-varchar-field-wierd

"es un valor nulo no lo mismo que una cadena de longitud cero.NULL representa la ausencia de cualquier valor, y el estándar SQL dice que un valor NULL nunca es igual a cualquier otro valor que incluye otra NULL"

Así %/%/% no obtendrá los valores NULL, pero añadiendo el código desde arriba vamos a corregir el error y obtener los campos de imagen con valores nulos. este es el resultado

$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' => '%/%/%' 
    ), 
)); 

Si desea trabajar con todos los atributos de la imagen, el código podría ser como este

$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

Probé todas estas respuestas en varias combinaciones, y solo obtuve un pequeño subconjunto de mi catálogo. La razón: originalmente importé mis productos usando un script de importación de imagen de producto a medida.

Si no especifiqué imágenes para algunas filas durante la importación, la secuencia de comandos no creó NULL o valores de atributo vacíos para esas imágenes. Simplemente no creó las filas de atributos en absoluto.

Dado que addAttributeToFilter usa una unión INNER de manera predeterminada y no había ningún valor de atributo de imagen al que unirse, las consultas publicadas aquí no captaron esas SKU.

El código siguiente devuelve todos los productos para los cuales la imagen, small_image o miniatura son nulos, con formato incorrecto, o la fila no aparece por completo.

El tercer parámetro para addAttributeToFilter le permite especificar el tipo de unión que se utilizará junto con las cláusulas OR de la declaración 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' 
    ); 

Si, como yo, que desea convertir esto en una consulta SQL para exportar como CSV desde el cliente de SQL, sólo tiene que imprimir la consulta desde el script PHP:

echo $products->getSelect(); 

tengo visto algunos SQL publicados en StackOverflow que codifica los números enteros attribute_id que hacen referencia a los atributos image, small_image y thumbnail, pero estos pueden diferir de una instalación a otra. En Magento, consultar con el ORM es mucho mejor que con el SQL.

0

he intentado todo, pero esto funciona para mí cuando Catálogo plana es permitir

$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

Puede utilizar este SQL sólo para ver qué producto no tiene imágenes:

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 

buena suerte!

Cuestiones relacionadas