我为Magento商店开发了一个自定义搜索引擎,我正在尝试按照特定的顺序加载产品系列(我根据我设计的算法对结果进行了排名)。
我可以正确加载产品系列,但它不是我想要的顺序。这里基本上是它现在如何工作:
我的数据库查询基本上带有PHP数组的产品ID。对于这个例子,我们可以这样说:
$entity_ids = array(140452, 38601 );
现在我可以转换140452和38601,每次产品系列都以相同的顺序返回。我希望产品集合的顺序与实体ID的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数组的顺序?
答案 0 :(得分: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());
}
答案 1 :(得分:1)
无法在SQL中任意排序,因此您必须在PHP之后对结果进行排序。那么更大的问题是你使用页面大小调整来限制返回的结果数量,因此可能无法返回你想要的一些记录。
更好的解决方案是向产品添加属性,然后您可以使用该属性进行排序。类别中的产品已经具有以这种方式使用的“位置”值。然后,您只需使用Alan建议的 addOrder()
addAttributeToSort()
方法,但需要使用自定义属性。
(匆匆解释,如果不够清楚,请告诉我)