Certaines collections de Magento se basent sur des tables à plat, et ne proposent pas de sélectionner des attributs des tables eav aussi facilement qu’un « addAttributeToSelect » sur une collection de produit, par exemple.
On a, ci-dessous, le cas d’une collection de clients inscrits à la newsletter, sur laquelle nous allons faire une jointure sur les tables eav, à partir de son object Zend_Db_Select:
Nous avons, tout d’abord, besoin de récupérer l’id de notre attribut, que nous avons nommé « monattribut » :
/* @var $write Varien_Db_Adapter_Pdo_Mysql */ $write = Mage::getSingleton('core/resource')->getConnection('core_write'); $attribute_id = $write->select() ->from('eav_attribute', 'attribute_id') ->where('entity_type_id = ?', 1) ->where('attribute_code = ?', 'monattribut') ->query() ->fetchColumn(0);
Une fois ceci fait, nous allons établir une jointure sur la table eav. Pour trouver la bonne, il faut regarder quel est le « backend_type » de l’attribut dans la table eav_attribute :
Nous pouvons ensuite établir notre jointure sur la table customer_entity_varchar comme ceci:
$collection->getSelect() ->joinLeft( array( 'customer_monattribut_table' => 'customer_entity_varchar' ), 'customer_monattribut_table.entity_id = main_table.customer_id AND customer_monattribut_table.attribute_id = ' . $attribute_id, array( 'monattribut' => 'customer_monattribut_table.value' ) );
Nous avons effectué une jointure sur la table customer_entity_varchar, mais il est tout a fait possible de ré-effectuer cette jointure à plusieurs reprises pour récupérer plusieurs champs du même backend_type.