Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Magento以任意顺序获取产品集合_Php_Orm_Magento - Fatal编程技术网

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

Php Magento以任意顺序获取产品集合,php,orm,magento,Php,Orm,Magento,我已经为我们的Magento商店开发了一个定制搜索引擎,我正在尝试按照非常特定的顺序加载产品集合(我已经根据我设计的算法对结果进行了排序) 我可以正确加载产品集合,但是它不是我希望的顺序。下面是它现在的工作原理: 我的数据库查询基本上返回一个产品ID的PHP数组。对于本例,我们假设它如下所示: $entity_ids = array(140452, 38601 ); 现在我可以转换140452和38601,产品系列每次都以相同的顺序返回。我希望产品集合的顺序与实体ID的ID相同 我用于创建收藏

我已经为我们的Magento商店开发了一个定制搜索引擎,我正在尝试按照非常特定的顺序加载产品集合(我已经根据我设计的算法对结果进行了排序)

我可以正确加载产品集合,但是它不是我希望的顺序。下面是它现在的工作原理:

我的数据库查询基本上返回一个产品ID的PHP数组。对于本例,我们假设它如下所示:

$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\u ids数组的顺序?

集合从类继承

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

Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection::addAttributeToSort
但是,这同样只能用于添加简单属性。要创建任意排序,您需要直接操作
Zend\u 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());
        }

在SQL中没有任意排序的方法,因此之后必须在PHP中对结果进行排序。然后,更大的问题是您正在使用页面大小来限制返回的结果的数量,您想要的一些记录可能因此而无法返回

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


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

我可能看错了问题,但我认为他想订购他目前在PHP中使用的数组(该数组不一定与数据库中的任何列相关)。这将使他能够按任何列进行排序,但他必须将数据返回到数据库中。虽然实现find_in_set解决方案的时间更长,但直接使用实体ID数组确实具有很好的优势。1000 ups可再次挽救我的生命。。谢谢艾伦:)有几件事。1.看起来addOrder在EAV集合上不起作用,您需要添加AttributeToSort 2。您通常可以在SQL中使用实现的“find_in_set”函数实现任意排序。如果适用的话,使用position可能是一个聪明的主意。