我有以下代码从 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 但我不知道为什么没有 description。
我知道我能做到
Mage::getModel('catalog/product')->load($product->getId())
但我不想多次查询数据库。有没有办法解决这个问题或在我执行 getCollection() 时获取这些字段?
更新:看来我的主要问题是,我只在运行第一个代码时才获得必填字段。在我得到 $collection
的部分,我想在产品的描述页面中包含其他字段。如果不为每个单一产品加载,那么代码是什么?
最佳答案
当像这样使用模型集合时,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 AS
status
, e
.entity_id
, e
.type_id
, e
.attribute_set_id
, e
.entity_id
, e
code>.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
, links_purchased_separately
,e
。links_title
,e
。msrp
, e
.msrp_display_actual_price_type
, e
.msrp_enabled
, e
.名称
,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
.缩略图
, 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
.可见性
, e
.weight
, e
.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
关于php - Magento getModel ('catalog/product' )->getCollection() with addAttributeToSelect ('*' ) 不返回描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26614997/