Magento获取所有产品

12

我想获取Magento的整个产品集合,没有任何过滤或限制,但我无法获得所有产品。

我已经尝试了各种方法,但它们都只给我一个非常有限的产品选择。假设商店包含5000个产品,但仅显示500个。当我检查目录->产品时,它确实向我展示了整个列表。

Mage::getModel('catalog/product')->getCollection();
Mage::getResourceModel('catalog/product_collection')->addAttributeToSelect('*');
Mage::getModel("catalog/product")->getResourceCollection()->load();

所有这些代码都返回相同的数量(500),但我期望它可以给我返回5000个产品。我希望不使用Zend或PHP,而只是坚持使用Magento的方式来获取它们。

有人知道如何真正获取所有产品,或者可以指导我为什么不起作用吗?

返回的Select-string为:

SELECT 1 AS `status`, `e`.`entity_id`, `e`.`type_id`, `e`.`attribute_set_id` FROM `catalog_product_flat_4` AS `e`

我猜“缺失”的产品来自不同的商店?默认情况下,目录集合按商店ID进行过滤。我不确定您是否可以覆盖此设置,因为属性可以根据商店设置,这就是它决定为模型提取哪些属性的方式。循环遍历您的商店并获取每个商店的产品可能是获得所有产品的最佳机会。 - Peter O'Callaghan
实际上它们并不是全部... 当我进入目录产品并按商店筛选时,我仍然有更多的产品(比如说3000个)。如果我再按启用/禁用进行筛选,那么从返回的500个产品中只会给我10个。所以即使这些过滤器已经默认设置了,我仍然会“错过”10个产品。 - JNDPNT
1
使用 echo (string) Mage::getModel('catalog/product')->getCollection()->getSelect(); 获取数据库查询语句,并将其添加到您的问题中,这可能会有所帮助。 - clockworkgeek
这个问题解决了吗?我也遇到了同样的问题,当我按可配置过滤时,返回了320个产品。 - Theodores
在我的情况下,这是因为我在查找平面表时实际上需要所有产品。如果您需要相同的内容,则应在非平面表上编写查询以获取所需内容。 - JNDPNT
显示剩余5条评论
6个回答

15
//to overwrite limit but you need first to increase your memory limit

 $collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('*') // select all attributes
->setPageSize(5000) // limit number of results returned
->setCurPage(1); // set the offset (useful for pagination)

// we iterate through the list of products to get attribute values
foreach ($collection as $product) {
  echo $product->getName(); //get name
  echo (float) $product->getPrice(); //get price as cast to float
  echo $product->getDescription(); //get description
  echo $product->getShortDescription(); //get short description
  echo $product->getTypeId(); //get product type
  echo $product->getStatus(); //get product status

  // getCategoryIds(); returns an array of category IDs associated with the product
  foreach ($product->getCategoryIds() as $category_id) {
      $category = Mage::getModel('catalog/category')->load($category_id);
      echo $category->getName();
      echo $category->getParentCategory()->getName(); // get parent of category
  }
  //gets the image url of the product
  echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).
      'catalog/product'.$product->getImage();
  echo $product->getSpecialPrice();
  echo $product->getProductUrl();  //gets the product url
  echo '<br />';
}

10

还有这种情况:

$products = Mage::getModel('catalog/product')->getCollection();
foreach($products as $prod) {
$product = Mage::getModel('catalog/product')->load($prod->getId());
}

使用这种方法,我得到的数量超过了500,但是我的产品...


1
同样的事情。不是产品没有被加载,而是它们在集合中不存在......当然,不存在的东西是不能被加载的 :-)。 - JNDPNT
1
在循环内部使用 load() 不是一种不好的做法吗? - scrowler
我很难回答你的问题,因为我已经一年多没有接触Magento了。你还有其他想法吗?也许你可以收集所有的ID,然后请求这些ID,但我不记得是否可行。我当时是在使用这个循环来编写内部脚本,所以性能问题对我来说并不重要。 - Alexandre

5
这里有几种可能性: 1. 内部限制,比如总共只能有500个。 2. 分页限制。每页显示的商品数量(在数据库中)。 3. 懒加载限制。
也许存在其他问题,但我认为这是某种内部限制。

1
这并不是因为“500”只是一个虚构的数字来抽象事物。实际上,它更像是334,这并不是一个确切的限制数字。感谢你和我一起思考 : )。我认为Alexandre部分正确,但可能还有更多默认过滤器被应用。 - JNDPNT

2

在管理后台的system > configuration > catalog > catalog中关闭flat_catalog_product。这样做之后,您将获得完整的产品集合。虽然这只是一个解决方法,但它帮助我达到了我需要达到的目的。


有没有关于启用平面目录的情况下检索完整产品集合的想法? - zekia

1
你可能正在使用平面目录产品结构。这将为每个店铺视图创建单独的表格。
使用下面的代码打印SQL查询。你会看到集合来自平面表,比如:

catalog_product_flat_38

echo Mage::getModel('catalog/product')->getCollection()->getSelect();

0

尝试使用

Mage::app()->setCurrentStore('0');
// same as 
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

这帮助了我


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接