Magento: как объединить две коллекции продуктов в одну?
Если у меня есть две коллекции продуктов, есть способ объединить их в один?
например (мое последнее намерение состоит не в том, чтобы просто получить коллекцию из 2 кошек, это просто для иллюстрации проблемы):
$collection1 = Mage::getModel('catalog/category')->load(148)->getProductCollection();
$collection2 = Mage::getModel('catalog/category')->load(149)->getProductCollection();
$merged_collection = merge_collections($collection1,$collection2);
любая помощь будет оценена!
Ответы
Ответ 1
Предполагая, что элементы, которые вы хотите группировать, имеют один и тот же тип и существуют в базе данных, вы можете сделать это:
$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 не заполнено правильно.
Ответ 2
Почти каждая (или каждая?) коллекция в 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());
}
Ответ 3
Я не думаю, что есть такой метод, но вы, вероятно, можете сделать что-то подобное:
foreach ($collection1 as $item){
$collection2->addElem($item);
}
Ответ 4
вы можете напрямую фильтровать свою коллекцию, не используя 2.
$products = Mage::getModel('catalog/product');
$_collection = $products->getCollection();
->addCategoryFilter(2)
->load();
или попробуйте использовать 'addItem', чтобы добавить результаты в коллекцию. См. Также в Magento wiki
Ответ 5
для набора продуктов нескольких категорий, вы можете использовать следующий код
$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);