Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Magento getModel('catalog/product')->getCollection() with addAttributeToSelect('*') not returning description

Tags:

php

magento

I have below code to get all products data from magento but it is not returning me the description field. I'm only getting short_description. Actually,its missing several fields in addition to description. Anyway here is the code:

$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');

This creates the following query when I var_dump it:

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))

So there is only short_description but I have no idea why description is not there.

I know I can do

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

But I don't want to query the DB lots of times. Is there way to work around this or get those fields when I do getCollection()?

Update: It seems my main issue is, I'm only getting required fields when I run the first code. In section where I get $collection I want to include additional fields in the description page of the product. What would be the code for that without doing load for each single product?

like image 766
erincerol Avatar asked Jan 10 '23 13:01

erincerol


1 Answers

Magento doesn't load initially all attributes when using the model collection like this,

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

It's select the table

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

Magento using the orm tables. If we dig more in this,

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

Now you can see the additional quires will be running.

For more details please go here

But you can get all product detail collection from flat table without querying multiple time to database . For that you need to enable the flat in admin-> system->configuration ->catalog->catalog-> Front end-> Here you can see the options to enable flat catalog

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

For more details about flat catalog please go here.

So now you see the query now it will like,

SELECT 1 AS status, e.entity_id, e.type_id, e.attribute_set_id, 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.necklace_length, e.necklace_length_value FROM catalog_product_flat_1 AS e

But remember some methods are not available in flat catalog and also if it is disabled.

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
like image 159
Elavarasan Avatar answered Jan 27 '23 03:01

Elavarasan