【问题标题】:Magento getModel('catalog/product')->getCollection() with addAttributeToSelect('*') not returning descriptionMagento getModel('catalog/product')->getCollection() with addAttributeToSelect('*') 不返回描述
【发布时间】:2014-10-29 14:29:55
【问题描述】:

我有以下代码可以从 magento 获取所有产品数据,但它没有返回描述字段。我只得到short_description。实际上,除了描述之外,它还缺少几个字段。无论如何这里是代码:

$collection = Mage::getModel('catalog/product')->getCollection()
            ->joinField(
                    'qty', 'cataloginventory/stock_item', 'qty', 'product_id=entity_id', '{{table}}.stock_id=1', 'left'
            )
            ->addAttributeToFilter('status', 1) // enabled
            ->addUrlRewrite()
            ->addPriceData()
            ->addStoreFilter($store_id)
            ->addAttributeToSelect('*');
    Mage::getSingleton('catalog/product_status')->addSaleableFilterToCollection($collection);
    Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($collection);
    $collection->setOrder('sku', 'desc');

这会在我 var_dump 时创建以下查询:

SELECT 1 AS `status`, `e`.`entity_id`, `e`.`type_id`, `e`.`attribute_set_id`, `at_qty`.`qty`, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price`, `e`.`entity_id`, `e`.`attribute_set_id`, `e`.`type_id`, `e`.`allow_open_amount`, `e`.`cost`, `e`.`created_at`, `e`.`email_template`, `e`.`enable_googlecheckout`, `e`.`giftcard_amounts`, `e`.`giftcard_type`, `e`.`gift_message_available`, `e`.`gift_wrapping_available`, `e`.`gift_wrapping_price`, `e`.`has_options`, `e`.`image_label`, `e`.`is_recurring`, `e`.`is_redeemable`, `e`.`lifetime`, `e`.`links_exist`, `e`.`links_purchased_separately`, `e`.`links_title`, `e`.`msrp`, `e`.`msrp_display_actual_price_type`, `e`.`msrp_enabled`, `e`.`name`, `e`.`news_from_date`, `e`.`news_to_date`, `e`.`open_amount_max`, `e`.`open_amount_min`, `e`.`price`, `e`.`price_type`, `e`.`price_view`, `e`.`recurring_profile`, `e`.`required_options`, `e`.`shipment_type`, `e`.`short_description`, `e`.`sku`, `e`.`sku_type`, `e`.`small_image`, `e`.`small_image_label`, `e`.`special_from_date`, `e`.`special_price`, `e`.`special_to_date`, `e`.`tax_class_id`, `e`.`thumbnail`, `e`.`thumbnail_label`, `e`.`updated_at`, `e`.`url_key`, `e`.`url_path`, `e`.`use_config_email_template`, `e`.`use_config_is_redeemable`, `e`.`use_config_lifetime`, `e`.`visibility`, `e`.`weight`, `e`.`weight_type`, `e`.`brand`, `e`.`brand_value`, `e`.`new_in`, `e`.`new_in_value`, `e`.`amconf_simple_price`, `e`.`volume_weight`, `e`.`product_3rd_type`, `e`.`product_3rd_type_value`, `e`.`product_sub_type`, `e`.`product_sub_type_value`, `e`.`product_type`, `e`.`product_type_value`, `e`.`parent_sku`, `at_inventory_in_stock`.`is_in_stock` AS `inventory_in_stock` FROM `catalog_product_flat_1` AS `e`
 LEFT JOIN `cataloginventory_stock_item` AS `at_qty` ON (at_qty.`product_id`=e.entity_id) AND (at_qty.stock_id=1)
 INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '1' AND price_index.customer_group_id = 0
 INNER JOIN `cataloginventory_stock_item` AS `at_inventory_in_stock` ON (at_inventory_in_stock.`product_id`=e.entity_id) AND ((at_inventory_in_stock.use_config_manage_stock = 0 AND at_inventory_in_stock.manage_stock=1 AND at_inventory_in_stock.is_in_stock=1) OR (at_inventory_in_stock.use_config_manage_stock = 0 AND at_inventory_in_stock.manage_stock=0) OR (at_inventory_in_stock.use_config_manage_stock = 1 AND at_inventory_in_stock.is_in_stock=1))

所以只有 short_description 但我不知道为什么没有描述。

我知道我能做到

Mage::getModel('catalog/product')->load($product->getId())

但我不想多次查询数据库。当我执行 getCollection() 时,有没有办法解决这个问题或获取这些字段?

更新:看来我的主要问题是,我只在运行第一个代码时才获得必填字段。在我得到$collection 的部分中,我想在产品的描述页面中包含其他字段。如果不对每个产品进行加载,那么代码是什么?

【问题讨论】:

    标签: php magento


    【解决方案1】:

    在使用这样的模型集合时,Magento 最初不会加载所有属性,

    $collections = Mage::getModel('catalog/product')->getCollection(); 
    

    选择表

    SELECT `e`.* FROM `catalog_product_entity` AS `e`
    

    Magento 使用 orm 表。如果我们在这方面挖掘更多,

    foreach($collections as $collection) {
        echo $collection->getName();
    }
    

    现在您可以看到正在运行的其他查询。

    更多详情请转至here

    但是您可以从平面表中获取所有产品详细信息集合,而无需多次查询数据库。为此,您需要在admin-> system->configuration ->catalog->catalog-> Front end-> 中启用公寓 在这里您可以看到启用平面目录的选项

    Use Flat Catalog Category -> Enable
    Use Flat Catalog Product  -> Enable
    

    有关平面目录的更多详细信息,请转到here

    所以现在你看到了它现在会喜欢的查询,

    SELECT 1 ASstatus,e.entity_id,e.type_id,e.attribute_set_id,e.@987654339.@,@987654337.@,@987654338. e.type_id, e.allow_open_amount, e.cost, e.created_at, e.email_template, e.enable_googlecheckout, @987654352 @.giftcard_amounts, e.giftcard_type, e.gift_message_available, e.gift_wrapping_available, e.gift_wrapping_price, @987654363.@.@9876 image_label, e.is_recurring, e.is_redeemable, e.lifetime, e.links_exist, e.links_purchased_separately, e.@987654377 @,e.msrp,e.msrp_display_actual_price_type,e.msrp_enabled,e.name,e.news_from_date,news_from_date,news_from_date,@987654387. e.open_amount_max, e.open_amount_min, e.price, e.price_type, e.price_view, e.recurring_profile, @987654402 @.required_options, e.shipment_type, e.@987654407 @,e.sku,e.sku_type,e.small_image,e.small_image_label,e.@98765449@,e,e,@987654418. e.special_to_date, e.tax_class_id, e.thumbnail, e.thumbnail_label, e.updated_at, e.url_key, @987654432 @.url_path, e.use_config_email_template, e.use_config_is_redeemable, e.use_config_lifetime, e.e, @9876544442@.@9876 weight_type, e.necklace_length, e.necklace_length_value FROM catalog_product_flat_1 AS e

    但请记住,某些方法在平面目录中不可用,并且如果它被禁用。

    Function Name                   Flat Catalog Enabled    Flat Disabled
    setLoadProductCount($flag)       No                      Yes
    setProductStoreId($storeId)      No                      Yes
    addParentPathFilter($parent)     Yes                     No
    addStoreFilter()                 Yes                     No
    addSortedField($sorted)          Yes                     No
    

    【讨论】:

      【解决方案2】:

      请尝试将description 字段“Used in Product Listing”的产品属性设置为“YES”。这将解决您的问题并避免加载单个产品模型。

      但请确保更改此属性后您必须重新索引数据。

      【讨论】:

      • 我认为我的问题略有不同。我用其他信息更新了问题。因此,对于这个特定的,他们根据需要设置了short_description,而description 不是。我需要找到一种方法将它们包含在我的第一个查询中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      相关资源
      最近更新 更多