Magento:如何将两个产品系列合并为一个?

时间:2011-03-25 16:03:40

标签: collections magento

如果我有两个产品系列,有没有办法将它们合并为一个?

例如

(我的最终意图不是实际上只是获得2只猫的集合,这只是为了说明问题):

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

$merged_collection = merge_collections($collection1,$collection2);

任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:22)

假设您希望组合在一起的项目属于同一类型且存在于数据库中,那么您可以这样做:

$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('*');

我知道要按entity_id进行过滤,因为这是产品的关键字段,就像大多数实体类型一样,某些平面表具有不同的主键。通常,您可以使用集合的getIdFieldName()方法之一来概括它。在这种情况下,产品是一个不好的例子,因为它的ID字段名称没有正确填写。

答案 1 :(得分:14)

Magento中的几乎每个(或每个?)集合都继承自Varien Data Collection。集合是一个保存另一种类型对象的特殊对象。没有合并集合的方法,但您可以在集合中添加适当类型的其他项目。

像这样的代码可以让你到达你想去的地方,虽然可能有更有效的方法来循环并进行实际的合并。

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

//load an empty collection (filter-less collections will auto-lazy-load everything)
$merged = Mage::getModel('catalog/product')->getCollection()->addFieldToFilter('entity_id',-1);

//add items from the first collection
foreach($collection1 as $item)
{
    $merged->addItem($item);
}

//add items from the second collection
foreach($collection2 as $item)
{               
    //magento won't let you add two of the same thing to a collection
    //so make sure the item doesn't already exist
    if(!$merged->getItemById($item->getId())) 
    {
        $merged->addItem($item);
    }           
}

//lets make sure we got something
foreach($merged as $product)
{
    var_dump($product->getName());
}

答案 2 :(得分:5)

我认为没有这样的方法,但你可以做类似的事情:

foreach ($collection1 as $item){
    $collection2->addElem($item);
}

答案 3 :(得分:3)

您可以直接过滤您的收藏而无需使用2。

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

或尝试使用'addItem'将结果添加到集合中。另见Magento wiki

答案 4 :(得分:-1)

对于几个类别的产品的集合,您可以使用以下代码

      $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);