Magento: как объединить две коллекции продуктов в одну? - PullRequest
10 голосов
/ 25 марта 2011

если у меня есть две коллекции продуктов, есть ли способ объединить их в одну? Например,

(мое последнее намерение не состоит в том, чтобы на самом деле просто получить коллекцию из 2 кошек, это просто для иллюстрациивопрос):

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

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

любая помощь будет оценена!

Ответы [ 5 ]

23 голосов
/ 26 марта 2011

Если предположить, что элементы, которые вы хотите сгруппировать, имеют одинаковый тип и существуют в базе данных, то вы можете сделать это:

$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 не заполнены правильно.

15 голосов
/ 25 марта 2011

Почти каждая (или каждая?) Коллекция в 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());
}
5 голосов
/ 25 марта 2011

Я не думаю, что есть такой метод, но вы, вероятно, можете сделать что-то подобное:

foreach ($collection1 as $item){
    $collection2->addElem($item);
}
3 голосов
/ 25 марта 2011

вы можете отфильтровать вашу коллекцию напрямую, не используя 2.

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

или попробуйте использовать addItem, чтобы добавить свои результаты в коллекцию. Смотрите также в Magento wiki

0 голосов
/ 27 июля 2015

для сбора товаров нескольких категорий можно использовать следующий код

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