1

我继承了一个老开发人员负责的 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) 以这种方式使用对象是否会对性能或内存造成影响?

非常感谢!

4

2 回答 2

0

您有几种方法可以从 magento 访问数据:

  • 使用 load() => 它加载与模型相关的所有数据(属性)。它非常缓慢且性能杀手。对于产品,您应该仅在产品页面上使用 load() (因为您将在该页面上使用的所有数据都与单个对象相关......所以您可以完全加载它)

  • 使用 collection => 当您需要检索对象列表时,您必须(至少)使用一个集合。由您决定要检索的属性列表。您可以将属性添加到选择/过滤器,并且该集合将设法在后台对 EAV 表等进行 SQL 连接

  • 使用自定义 SQL => 集合在处理复杂对象时可能会很慢(一个集合初始化许多 SQL 连接到您可能不需要的表)...从 BDD 访问数据的最后一种方法是在您的 ResourceModel 中创建您自己的 SQL

在您展示的脚本中,有一个巨大的错误:您在 foreach 中加载了一个完整的模型,并在一个集合上进行迭代。你绝不能这样做,如果你必须加载()产品,我认为这是因为你没有在集合中找到一个属性?在这种情况下,您只需修改集合即可检索属性...

例如,对于一个产品,magento 提供了一种自动添加(或删除)属性到您实例化的任何产品->集合的方法。(参见 Mage_Catalog 的 config.xml 中的 frontend/product/collection/attributes XML 标签)

于 2012-10-17T15:37:25.587 回答
-1

这是因为 magento 使用缓存递归 OMG 系统,让关系数据库开发人员为之疯狂。我就是其中之一。但是,据我了解,我认为最好使用 Mage::getModel('model')->getCollection(),然后使用 php 进行一些 sql 搜索之王,因为当 Magento 商店启动时,它会创建一个 biggggggg 缓存模式以更快地提供一些信息,这是一种索引环。

所以,如果你只想要几个字段,你可以使用.....->getCollection()->addAttributeToSelect('name')。例如。

Gl 对你的 magento 的理解。

于 2012-10-17T14:56:07.703 回答