首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Magento:以编程方式获取产品列表

Magento:以编程方式获取产品列表
EN

Stack Overflow用户
提问于 2017-03-19 16:23:07
回答 3查看 873关注 0票数 0

我试图从我的Magento商店获得一个产品列表,我只需要在每个产品上加载三个属性,我想这比加载整个产品所花费的时间要短得多。现在,要么我做得不对,要么,我错了。这是我的剧本:

代码语言:javascript
复制
<?php
$script_start = microtime(true);

// Load Magento core
require_once '../app/Mage.php';
Mage::app();

// Load products :: collection

$query_create_start = microtime(true);

$prod_catalog = Mage::getModel("catalog/product")->getCollection()->
            addAttributeToSelect('sku')->
            addAttributeToSelect('name')->
            addAttributeToSelect('category_ids');

$query_create_end = microtime(true);

$query_create_time = $query_create_end - $query_create_start;

echo "Query creation took $query_create_time seconds.<br>";

$product_loop_start = microtime(true);
foreach($prod_catalog as $product) {
    var_dump($product);
    $one_product_loop = microtime(true);
    $one_product_time =  $one_product_loop - $product_loop_start;
    echo "Getting one product took $one_product_time seconds.<";
    die('done');
}
$product_loop_end = microtime(true);

?>

下面是输出(没有转储数据):

代码语言:javascript
复制
Query creation took 0.0043220520019531 seconds.
one product took 32.509027004242 seconds

现在,当我查看产品var_dump时,我发现它加载的属性比我所要求的要多:

代码语言:javascript
复制
object(Mage_Catalog_Model_Product)#74 (32) {
  ["_cacheTag":protected]=>
  string(15) "catalog_product"
  ["_eventPrefix":protected]=>
  string(15) "catalog_product"
  ["_eventObject":protected]=>
  string(7) "product"
  ["_canAffectOptions":protected]=>
  bool(false)
  ["_typeInstance":protected]=>
  NULL
  ["_typeInstanceSingleton":protected]=>
  NULL
  ["_linkInstance":protected]=>
  NULL
  ["_customOptions":protected]=>
  array(0) {
  }
  ["_urlModel":protected]=>
  NULL
  ["_errors":protected]=>
  array(0) {
  }
  ["_optionInstance":protected]=>
  NULL
  ["_options":protected]=>
  array(0) {
  }
  ["_reservedAttributes":protected]=>
  NULL
  ["_isDuplicable":protected]=>
  bool(true)
  ["_calculatePrice":protected]=>
  bool(true)
  ["_defaultValues":protected]=>
  array(0) {
  }
  ["_storeValuesFlags":protected]=>
  array(0) {
  }
  ["_lockedAttributes":protected]=>
  array(0) {
  }
  ["_isDeleteable":protected]=>
  bool(true)
  ["_isReadonly":protected]=>
  bool(false)
  ["_resourceName":protected]=>
  string(15) "catalog/product"
  ["_resource":protected]=>
  NULL
  ["_resourceCollectionName":protected]=>
  string(26) "catalog/product_collection"
  ["_dataSaveAllowed":protected]=>
  bool(true)
  ["_isObjectNew":protected]=>
  NULL
  ["_data":protected]=>
  array(12) {
    ["entity_id"]=>
    string(1) "7"
    ["entity_type_id"]=>
    string(1) "4"
    ["attribute_set_id"]=>
    string(1) "4"
    ["type_id"]=>
    string(6) "simple"
    ["sku"]=>
    string(10) "1000000000"
    ["has_options"]=>
    string(1) "0"
    ["required_options"]=>
    string(1) "0"
    ["created_at"]=>
    string(19) "2016-07-11 11:05:03"
    ["updated_at"]=>
    string(19) "2017-03-03 21:14:21"
    ["name"]=>
    string(62) "My simple product"
    ["is_salable"]=>
    string(1) "1"
    ["stock_item"]=>
    object(Varien_Object)#49 (7) {
      ["_data":protected]=>
      array(1) {
        ["is_in_stock"]=>
        string(1) "1"
      }
      ["_hasDataChanges":protected]=>
      bool(false)
      ["_origData":protected]=>
      NULL
      ["_idFieldName":protected]=>
      NULL
      ["_isDeleted":protected]=>
      bool(false)
      ["_oldFieldsMap":protected]=>
      array(0) {
      }
      ["_syncFieldsMap":protected]=>
      array(0) {
      }
    }
  }
  ["_hasDataChanges":protected]=>
  bool(true)
  ["_origData":protected]=>
  NULL
  ["_idFieldName":protected]=>
  string(9) "entity_id"
  ["_isDeleted":protected]=>
  bool(false)
  ["_oldFieldsMap":protected]=>
  array(0) {
  }
  ["_syncFieldsMap":protected]=>
  array(0) {
  }
}

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-21 09:29:36

当系统加载一个产品时,默认情况下它将加载所有静态属性。

静态属性存储在主实体表"catalog_product_entity“中,其他属性根据该属性的backen_type存储在相关表中。例如,“name”存储在“catalog_product_entity_varchar”中。

addAttributeToSelect方法只影响非静态属性,因此在您的示例中,您可以看到很多已经加载的静态属性。

您可以尝试以下代码:

代码语言:javascript
复制
$prod_catalog = Mage::getModel("catalog/product")->getCollection();          
$prod_catalog->getSelect()->reset("columns")->columns(array("sku","entity_id"));
$prod_catalog->addAttributeToSelect('name');
foreach($prod_catalog as $product) {
 $category_ids =  $product->getCategroyIds();
 ###you code
}

提示:虽然category_ids是静态的,但是主实体表和其他产品实体表中没有列,所以运行addAttributeToSelect('categroy_ids')或添加列函数是没有意义的,类别ids数据来自另一个表catalog_category_product")。

票数 1
EN

Stack Overflow用户

发布于 2017-03-19 21:35:58

您可以尝试将Mage::getResourceModel(‘catalog/product’)->getAttributeRawValue($productId, $atrributeCode, $storeId)用于单个属性,而不是getCollection(),这样可能会更快地满足您的需要。

票数 0
EN

Stack Overflow用户

发布于 2017-03-20 04:15:48

您已经启用了平面产品。平面产品索引器生成的平面表仅包含活动产品。这是出于性能原因。没有必要索引残疾产品,因为你不打算使用他们的前端。(平坦的桌子只在前端使用)

如果您正在尝试在自定义脚本中获取您的产品,并且需要获得禁用的脚本,那么您可以这样做。

这里是Mage::getResourceModel('catalog/product_collection') ->...add过滤器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42888998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档