Magento以任意顺序获得产品系列

时间:2010-10-21 17:34:47

标签: php orm magento

我为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数组的顺序?

2 个答案:

答案 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()方法,但需要使用自定义属性。

(匆匆解释,如果不够清楚,请告诉我)