我继承了一个老开发人员负责的Magento项目。 Magento 经验非常有限,我想了解产品集合和 catalog/product
模型是如何工作的。
具体来说,我想知道为什么集合和产品对象如此庞大?
我有这样的代码:
<?php $_productCollection = $this->getLoadedProductCollection(); ?>
<?php foreach ($_productCollection as $_product): ?>
<?php $_product = Mage::getModel( 'catalog/product' )->load( $_product->getId() ); ?>
<?php print $this->getLayout()->createBlock('mymodule_name/category_products_item')->setProduct($_product)->toHtml() ?>
<?php endforeach ?>
当我执行 print_r($_productCollection)
或 print_r($_product)
时,我得到了大量 的数据,而这一切都是我真正想要的是一些产品属性(ID、名称、价格、图片 URL 等)。
我习惯了自定义关系数据库平台,如果我需要使用产品,我只需做一些非常简单的事情,比如 SELECT id,name,price FROM products;
!我完全不确定如何在 Magento 中实现这一点。我要创建自定义模型还是什么?
谁能告诉我:
1)为什么上面的物体这么大?
2) 如果我只需要一些产品属性(如上所述),那么有没有办法将对象限制为仅那些属性以减小它们的大小?
3) 以这种方式使用对象是否会影响性能或内存?
非常感谢!
最佳答案
您可以通过多种方式从 magento 访问数据:
使用 load() => 它加载与模型相关的所有数据(属性)。它非常缓慢且性能 killer 。对于产品,您应该仅在产品页面上使用 load()(因为您将在该页面上使用的所有数据都与单个对象有关......因此您可以完整加载它)
使用集合 => 当您需要检索对象列表时,您必须(至少)使用一个集合。您可以决定要检索的属性列表。您可以将属性添加到选择/过滤器,并且该集合将设法在后台对 EAV 表等进行 SQL 连接
使用自定义 SQL => 处理复杂对象时集合可能会很慢(一个集合初始化许多 SQL 连接到您可能不需要的表)...从 BDD 访问数据的最后一种方法是创建您自己的ResourceModel 中的 SQL
在您显示的脚本中,存在一个巨大的错误:您在循环迭代集合的 foreach 中加载了一个完整的模型。你绝不能那样做,如果你必须加载()产品,我认为这是因为你没有在集合中找到属性?在这种情况下,您只需修改集合即可检索属性...
例如,对于产品,magento 提供了一种方法来自动向您实例化的任何产品-> 集合添加(或删除)属性。 (请参阅 Mage_Catalog 的 config.xml 中的 frontend/product/collection/attributes XML 标记)
关于php - 需要帮助理解 Magento 产品集合对象和目录/产品模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12936989/