我继承了一个老开发人员负责的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,名称,价格,图片网址)等等。)。
我已经习惯了一个自定义的关系数据库平台,如果我需要使用产品,我会做一些超简单的事情,比如SELECT id,name,price FROM products;
!我完全不确定如何在Magento实现这一目标。我可以创建自定义模型吗?
所以有人可以告诉我:
1)为什么上述物体如此巨大?
2)如果我只需要一些产品属性(如上所述)那么有没有办法将对象限制为只有那些属性来减小它们的大小?
3)以这种方式使用对象是否会影响性能或内存?
非常感谢!
答案 0 :(得分:0)
您可以通过多种方式从magento访问数据:
使用load()=&gt;它加载相对于模型的所有数据(属性)。这是非常缓慢和性能杀手。对于产品,您应该仅在产品页面上使用load()(因为您在该页面上使用的所有数据都是相对于单个对象的...因此您可以完整地加载它)
< / LI>使用collection =&gt;当您需要检索对象列表时,必须使用(至少)一个集合。由您决定要检索的属性列表。您可以添加属性以进行选择/过滤,并且该集合将设法将SQL连接执行到EAV表等...在后台
使用自定义SQL =&gt;处理复杂对象时集合可能很慢(集合初始化许多SQL连接到表可能不需要)...从BDD访问数据的最后一种方法是在ResourceModel中创建自己的SQL
在您显示的脚本中,存在一个巨大的错误:您在foreach中加载一个完整的模型迭代一个集合。你必须永远不要这样做,如果你必须加载()产品,我认为这是因为你没有在集合中找到属性?在这种情况下,您只需要修改集合以检索属性...
例如,对于产品,magento提供了一种自动添加(或删除)属性到您实例化的任何产品 - >集合的方法。 (请参阅Mage_Catalog的config.xml中的frontend / product / collection / attributes XML标记)
答案 1 :(得分:-1)
这是因为magento使用缓存递归OMG系统并使关系数据库开发人员疯狂。我是其中之一。 但是,根据我的理解,我最好使用Mage :: getModel('model') - &gt; getCollection(),然后在Magento商店启动时使用php进行sql搜索的一些王者,使得一个biggggggg缓存模式更快地提供一些信息,这是一种索引。
因此,如果您只想要几个字段,可以使用.....-&gt; getCollection() - &gt; addAttributeToSelect('name')。对于前。
对你的magento理解。