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 以任意顺序获取产品集合的主要内容,如果未能解决你的问题,请参考以下文章