10
votes

Magento: Comment fusionner deux collections de produits en un?

Si j'ai deux collections de produits, il existe un moyen de les fusionner en un?

Par exemple (mon intention finale n'est pas de recevoir une collection de 2 chats, il s'agit simplement d'illustrer le problème): xxx

toute aide serait appréciée!


0 commentaires

5 Réponses :


5
votes

Je ne pense pas qu'il y ait une telle méthode, mais vous pouvez probablement faire quelque chose comme ça: xxx


0 commentaires

3
votes

Vous pouvez filtrer votre collection directement sans utiliser 2.

$products = Mage::getModel('catalog/product');
$_collection = $products->getCollection();
->addCategoryFilter(2)
->load();


2 commentaires

Je ne peux pas filtrer puisque je vais recevoir les collections de deux manières différentes et ne pourra ajouter qu'un filtre. J'ai essayé Additem avant, mais lorsque vous passez à la page de gauche Nav & Listing Page, les chefs d'accusation sont tous foirés.


Oh je suis désolé, je ne le sais pas. Avez-vous essayé au lieu de fusionner deux collections pour créer un troisième en fonction des données de vos collections précédentes? (E.G. ID)



15
votes

Presque toutes les collections (ou toutes les?) de Magento hérite d'un Collection de données Varien . Une collection est un objet spécial qui contient des objets d'un autre type. Il n'y a pas de méthode de fusion de collections, mais vous pouvez ajouter des éléments supplémentaires du type approprié à la collection.

Code comme ceci devrait vous permettre d'aller où vous voulez aller, bien qu'il existe probablement des moyens plus efficaces de boucler et de faire la fusion réelle. xxx


1 commentaires

Le problème ici est que vous risquez d'obtenir une exception: élément (mage_catalog_model_product) avec le même identifiant "***" existe déjà



26
votes

En supposant que les éléments que vous souhaitez regrouper sont du même type et existent dans la base de données, vous pouvez le faire:

$collection1 = Mage::getModel('catalog/category')->load(148)->getProductCollection();
$collection2 = Mage::getModel('catalog/category')->load(149)->getProductCollection();

$merged_ids = array_merge($collection1->getAllIds(), $collection2->getAllIds());
// can sometimes use "getLoadedIds()" as well

$merged_collection = Mage::getResourceModel('catalog/product_collection')
    ->addFieldToFilter('entity_id', array('in' => $merged_ids))
    ->addAttributeToSelect('*');


2 commentaires

Cela nécessite 3 requêtes de base de données, mais la solution Haltabush ne nécessite que 2 requêtes de base de données. Je n'utiliserais pas cela s'il n'y a pas de filtres ou de traits supplémentaires nécessaires aux collections combinées.


Une note latérale .. addfieldofilter ('entity_id', $ fusible_ids) va traduire en où (entité_id = 1001) ou (entité_id = 1002) ou (entité_id = 1003) ou (entité_id = 1003) ou ) Ou .... qui est plus lent que in (1001, 1002, 1003, 1004) généré par addfieldtofilter ('intity_id', tableau ('in' = > $ fusible_ids))



-1
votes

Pour la collecte de produits de plusieurs catégories, vous pouvez utiliser le code suivant

      $collection = Mage::getModel('catalog/product')->getCollection()
        ->addAttributeToSelect('name')
        ->addAttributeToSelect('sku');

    $collection->getSelect()
        ->join(
            'catalog_category_product',
            'product_id=entity_id',
            array('category_id')
            )
        ->where('catalog_category_product.category_id IN (?)', $categories);


0 commentaires