Quel est l'équivalent Magento ORM de «SELECT DISTINCT attribute FROM products»?

8

J'ai besoin de récupérer une liste de toutes les valeurs qui sont utilisées pour un attribut de produit spécifique, en (pseudo) SQL:

SELECT DISTINCT attribute FROM products;

Comment utiliser l'ORM Magento pour générer une requête équivalente? J'ai essayé la distinct()fonction mais elle ne fonctionne pas comme je m'y attendais:

// Returns an array of NULL with a length equal to all products in the catalog
Mage::getModel('catalog/product')->getCollection()
            ->addAttributeToSelect('attribute')
            ->distinct(true)
            ->getColumnValues('attribute');

Ce que je cherche à obtenir serait un tableau de attributevaleurs, sans doublons

array('some value', 'some other value', 'a really common value', 'etc...');
STW
la source
Recherchez-vous des valeurs pour tous les types d'attributs? ou des listes déroulantes?
Rabea

Réponses:

1

Grâce à kalpesh, c'est déjà blogué:

http://ka.lpe.sh/2011/06/06/magento-get-all-the-values-of-a-magento-eav-for-a-particular-attribute-code/

$attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', 'color'); //here, "color" is the attribute_code
$allOptions = $attribute->getSource()->getAllOptions(true, true);
foreach ($allOptions as $instance) {
    $myArray[$instance['value']] = $instance['label'];
}
Mage::log($myArray);

Voici une autre solution: https://stackoverflow.com/a/15509714/1480397

Mais je ne sais pas si cela fonctionne sur des attributs non sélectionnés.

Fabian Blechschmidt
la source
Oui, cela ne fonctionnera que pour les attributs de sélection, mais pour ceux-ci, c'est la voie à suivre.
Fabian Schmengler
1

Vous pouvez soumettre toutes les instructions SQL directement via la connexion pour acquérir toutes les données qui ne sont pas accessibles via l'API de magentos.

$db_resource = Mage::getSingleton('core/resource');
$db_connection = $db_resource->getConnection('core_write');
$sql = sprintf("SELECT DISTINCT attribute FROM `%s`", $db_resource->getTableName('product'));
$dataset = $db_connection->fetchAll($sql);

Les fonctions de requête sont fetchRow et fetchAll et sont structurées:

fetchAll ($ structure_sql, $ bind_filters = array (), $ fetchMode = null)

ppostma1
la source