【问题标题】:Magento get all productsMagento 获取所有产品
【发布时间】:2012-02-11 10:22:39
【问题描述】:

我正在尝试获取整个 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 1 AS `status`, `e`.`entity_id`, `e`.`type_id`, `e`.`attribute_set_id` FROM `catalog_product_flat_4` AS `e`

【问题讨论】:

  • 我认为“丢失”的产品来自不同的商店?默认情况下,目录集合按商店 ID 过滤。我不确定您是否可以覆盖它,因为可以在商店的基础上设置属性,这就是它决定为模型拉回哪些属性的方式。遍历您的商店并为每个商店获取产品可能是您获得所有产品的最佳机会。
  • 实际上它们并不是全部...当我转到目录产品并按商店过滤时,我仍然有更多产品(例如 3000)。如果我另外过滤启用/禁用它会给我返回的 500 个产品中的 10 个产品。所以我仍然“错过”了 10 种产品,即使这些过滤器是默认设置的。
  • 使用 echo (string) Mage::getModel('catalog/product')->getCollection()->getSelect(); 检索数据库查询并将其添加到您的问题中,这可能会有所帮助。
  • 我已根据您的要求将选择字符串添加到问题中。
  • 这是在哪个商店上下文中运行的?

标签: magento collections product


【解决方案1】:
//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 />';
}

【讨论】:

    【解决方案2】:

    还有这样的:

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

    通过这种方法,我得到了超过 500 个,但我所有的产品......

    【讨论】:

    • 同样的事情。不是产品没有被加载,而是它们不存在于集合中......当然不能加载不存在的东西:-)。
    • 在循环中load() 不是坏习惯吗?
    • 我很难回答你,因为我已经一年多没有接触 Magento 了。你还想怎么做?可能您可以收集所有 ID,然后请求此 ID,但我不记得是否可能。我将此循环用于内部脚本,因此在我的情况下性能问题并不重要。
    【解决方案3】:

    这里有几种可能性: 1.一些内部限制,比如500。 2.一些分页限制。每页产品(在数据库摘要中) 3. 一些延迟加载的限制。

    也许,有一些过度的问题,但我认为这是一些内在的限制。

    【讨论】:

    • 这不是因为“500”只是抽象事物的虚构数字。实际上,它类似于 334,这并不完全是一个限制数字。谢谢你和我一起思考:)。我认为 Alexandre 部分正确,但可能应用了更多默认过滤器。
    【解决方案4】:

    在管理员 > 系统 > 配置 > 目录 > 目录中关闭您的 flat_catalog_product。在此之后,您将获得完整的产品系列。尽管这是一种解决方法,但它帮助我实现了我需要实现的目标。

    【讨论】:

    • 关于检索完整产品集合、启用平面目录的任何想法?
    【解决方案5】:

    您可能正在使用平面目录产品结构。这会为每个商店视图创建单独的表。

    使用下面的代码打印 sql 查询。你会看到收藏来自像

    这样的平板

    catalog_product_flat_38

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

    【讨论】:

      【解决方案6】:

      尝试使用

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

      这对我有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多