2010-10-21 80 views
5

我已经为我们的Magento商店开发了一个自定义搜索引擎,并且我尝试以非常特定的顺序加载产品集合(我根据我设计的算法对结果进行了排名) 。Magento以任意顺序获得产品集合

我可以正确地加载产品收集,但它是不是在为了我想它是在这里基本上是它现在是如何工作的:

我的数据库查询基本回来了PHP产品ID数组。对于这个例子可以说,它看起来像这样:

$entity_ids = array(140452, 38601); 

现在我可以转的140452和38601和产品收集回来的相同顺序各一次。我希望产品收集的顺序与实体标识的ID相同。

我使用创建我收藏的代码如下:

$products = Mage::getModel('catalog/product') 
    ->getCollection() 
    ->addAttributeToSelect('*') 
    ->addAttributeToFilter('entity_id', array('in' => $entity_ids)) 
    ->setPageSize($results_per_page) 
    ->setCurPage($current_page) 
    ->load(); 

有没有一种方法来设置排序顺序是$ entity_ids排列的顺序?

回答

13

从集合类

Varien_Data_Collection_Db 

继承有一个在该类命名为addOrder方法。

public function addOrder($field, $direction = self::SORT_ORDER_DESC) 
{ 
    return $this->_setOrder($field, $direction); 
} 

所以,你会觉得这样的事情应该基本订购工作

Mage::getModel('catalog/product') 
->getCollection() 
->addAttributeToSelect('*') 
->addOrder('entity_id'); 

然而,事实并非如此。由于复杂的接合参与EAV集合,有用于属性然而再加入订单条款

Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection::addAttributeToSort 

一个特殊的方法,这只能用来添加简单的属性。要创建任意排序,您需要直接操作Zend_Select对象。我不是一个很大的粉丝,我不是很喜欢使用自定义mysql函数来实现的东西,但它似乎是唯一的方法来做到这一点

我测试了股票安装以下代码并取得了预期的结果。你应该可以使用它来获得你想要的。

 $ids = array(16,18,17,19); 
     $products = Mage::getModel('catalog/product')->getCollection() 
     ->addAttributeToSelect('*') 
     ->addAttributeToFilter('entity_id',$ids);   

        //shakes fist at PDO's array parameter 
        $ids = array_map('intval', $ids); 
     $products->getSelect()->order("find_in_set(e.entity_id,'".implode(',',$ids)."')"); 
     foreach($products as $product) 
     { 
      var_dump($product->getEntityId()); 
      var_dump($product->getSku()); 
     } 
+0

我可能读错的问题,但我认为他希望订购他目前在PHP(这不一定与阵列上到DB中的任何列)。这应该让他按任何列进行排序,但是他必须将数据返回到数据库中。 – 2010-10-21 20:31:42

+0

啊,是的,我误解了这个问题。我认为,这是职业倦怠。 – 2010-10-22 01:39:57

+1

已更新的问题与更正确的答案。 – 2010-10-22 02:45:40

1

无法在SQL中任意排序,因此您必须在PHP中对结果进行排序。那么更大的问题是,您正在使用页面大小限制返回结果的数量,因此可能不会返回您想要的某些记录。

更好的解决方案是将一个属性添加到产品中,然后您可以使用该属性进行排序。类别中的产品已经具有以这种方式使用的“位置”值。然后,您只需使用Alan建议的但使用自定义属性的方法即 addOrder() addAttributeToSort()方法。

(解释急促,让我知道,如果不够明确)

+0

几件事情。 1.看起来addOrder在EAV集合上不起作用,您需要添加AttributeToSort 2.您通常可以使用该实现的“find_in_set”函数实现SQL中的任意排序。如果适用,使用职位可能是一个聪明的想法。 – 2010-10-22 02:48:29

+0

感谢您的纠正。 – clockworkgeek 2010-10-22 09:22:58

相关问题