2010-10-21 79 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

相關問題