2010-08-25 20 views
7

Ho alcune migliaia di prodotti e voglio trovare tutti i prodotti senza un'immagine. Ho provato a cercare (nessuna immagine) nella griglia dei prodotti di amministrazione, ma nessun risultato. Come posso creare una query SQL che disabilita tutti questi prodotti?Come posso trovare tutti i prodotti senza immagini in Magento?

+0

@ Michael Myers: perché l'hai modificato quasi un anno dopo la pubblicazione? –

+0

@ Zéychin: non ci sono limiti di legge sulle modifiche. Ogni volta che vedi qualcosa che potrebbe essere migliorato, per favore sentiti libero di andare avanti e farlo. In questo caso, ero qui perché qualcuno ha postato una non risposta che sono venuto a cancellare. –

+1

Oh sì, è giusto. Ho appena visto: modificato da ..., e dal modo in cui è posizionato, sembra che tu abbia modificato la domanda apparentemente, non rimossa la (falsa) risposta! Questo ha molto più senso. Saluto il tuo lavoro per questa comunità. –

risposta

0

Ho scritto un articolo del blog un po 'indietro con una query sql per trovare le immagini mancanti. Non disabilita i prodotti, ma è almeno un inizio: http://prattski.com/2010/06/29/magento-sql-to-find-missing-images/. Dovrebbe essere abbastanza facile da fare da questo punto. Potrebbe essere necessario modificare l'ID dell'attributo se il tuo non corrisponde alla mia.

15

Smettere di pensare in termini di SQL. Inizia a pensare in termini di modelli di Magento. I modelli di Magento semplicemente usano SQL come back-end. È possibile eseguire una query per le operazioni tramite SQL raw, ma varierà dalla versione alla versione di Magento e potrebbe variare in base al back-end che si sta utilizzando.

Eseguire quanto segue da un'azione del controller di test o da un'altra parte in cui è possibile eseguire codice Magento. Interroga il modello per i prodotti senza immagine

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

E se volessi tutti i prodotti CON le immagini? – swl1020

+0

@ swl1020 Non ho provato questo, ma un filtro standard non uguale ('neq') dovrebbe funzionare. '' -> addAttributeToFilter ('image', array ("neq" => 'no_selection')); 'La lista completa delle opzioni di filtro è disponibile in questo articolo: http://alanstorm.com/magento_collections –

+0

Le raccolte sono molto meglio di debugging delle istruzioni SQL auto-offensive necessarie per lavorare con EAV in qualsiasi giorno della settimana. Il lavoro è già stato fatto per te, devi solo prestare attenzione alla logica che usi per lavorare con il risultato. –

1

anche, per ottenere lo sql che la query Alan descrive corre dietro le quinte:

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

0

Ci sono due modi per farlo:

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

Sopra il codice dovrebbe funzionare ma nel mio caso non funzionava. Così ho provato a seguire:

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

Buona fortuna!

6

So che questo è super vecchio, ma l'ho trovato utile, quindi ho pensato di pubblicare un aggiornamento.

In aggiunta alla risposta di Alan sopra, ho scoperto che ci sono altri scenari oltre al "no_selection" .. forse a causa di plug-in o errori generali nel sistema? L'ultimo nlike troverà effettivamente tutto, ma ho lasciato gli altri solo per divertimento.

Modificare la query di raccolta come segue:

$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

per il prodotto senza piccola immagine provare questo

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

ritrovamento attribute_id in eav_attribute tavolo

0

voglio solo aggiungere che la risposta di Sean Michaud ha ragione, tranne che non abbiamo bisogno di usare quello

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

Utilizzando la pagina: http://bytes.com/topic/sql-server/answers/83267-wildcard-doesnt-match-using-like-varchar-field-wierd

"Un valore NULL è non la stessa come una stringa di lunghezza zero.NULL rappresenta l'assenza di qualsiasi valore, e lo standard SQL dice che un valore NULL non è mai uguale a qualsiasi altro valore tra cui un altro NULL"

Quindi %/%/% non sarà possibile ottenere i valori NULL, ma aggiungendo il codice dall'alto ci sarà correggere l'errore e ottenere i campi di immagine con i valori NULL. questo è il risultato

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

Se si desidera lavorare con tutti gli attributi dell'immagine, il codice potrebbe essere come questo

$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

Ho provato tutte queste risposte in varie combinazioni e ho ricevuto solo un piccolo sottoinsieme del mio catalogo. Il motivo: ho originariamente importato i miei prodotti utilizzando uno script di importazione dell'immagine prodotto su misura.

Se non ho specificato le immagini per alcune righe durante l'importazione, lo script non ha creato NULL o valori di attributo vuoti per tali immagini. Semplicemente non ha creato le righe di attributo.

Poiché addAttributeToFilter utilizza un join INNER per impostazione predefinita e non c'era alcun valore di attributo immagine a cui partecipare, le query pubblicate qui non catturavano quegli SKU.

Il seguente codice restituisce tutti i prodotti per i quali immagini, small_image o miniatura sono nulli, non correttamente formattato, o la riga manca del tutto.

Il terzo parametro su addAttributeToFilter consente di specificare il tipo di join da utilizzare in combinazione con le clausole OR dell'istruzione 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' 
    ); 

Se, come me, si desidera convertire questo a una query SQL per esportare come file CSV dal tuo client SQL, è sufficiente stampare la query dallo script PHP:

echo $products->getSelect(); 

ho visto alcuni SQL pubblicati su StackOverflow che codificano gli interi attribute_id che si riferiscono agli attributi image, small_image e thumbnail, ma possono differire da un'installazione all'altra. In Magento, l'interrogazione con l'ORM è molto meglio che con l'SQL.

0

Ho provato tutti, ma questo funziona per me quando catalogo piatto è consentire

$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

È possibile utilizzare questo SQL solo per vedere quale prodotto non ha immagini:

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 

Good Luck!

Problemi correlati