Magento 以任意顺序获取产品集合

Posted

技术标签:

【中文标题】Magento 以任意顺序获取产品集合【英文标题】:Magento get a product collection in an arbitrary order 【发布时间】:2010-10-21 17:34:46 【问题描述】:

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

【问题讨论】:

【参考方案1】:

集合继承自类

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 Collections 中涉及复杂的连接,因此有一种特殊的方法用于向 order 子句添加属性

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());
        

【讨论】:

我可能读错了这个问题,但我认为他想对他目前在 PHP 中拥有的数组进行排序(这不一定与数据库中的任何列相关)。这应该可以让他按任何列进行排序,但他必须将数据取回数据库。 虽然执行 find_in_set 解决方案的时间更长,但确实具有直接使用实体 ID 数组的好处。 1000 ups 再次救了我的命 .. 谢谢艾伦 :)【参考方案2】:

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

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

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

【讨论】:

几件事。 1. 看起来 addOrder 不适用于 EAV 集合,您需要 addAttributeToSort 2. 您通常可以使用实现的“find_in_set”函数在 SQL 中实现任意排序。不过,如果适用的话,使用位置可能是一个聪明的主意。

以上是关于Magento 以任意顺序获取产品集合的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Magento 的低库存集合中仅获取已启用的产品

Magento 2 从搜索页面获取所有产品

Magento 获取未加载所有属性的相关产品

在 Magento 中获取基本产品图像

Magento - 包含当前用户愿望清单的产品系列

自定义产品集合上的 Magento 分层导航