Magento如何获取数据

Magento Alan 10年前 (2014-07-11) 5043次浏览 0个评论 扫描二维码

根据前面的学习,我们已经成功获取产品实体及其特定的一些属性,下面就该看看如何获取直实的值了。为简化起见,这里仅介绍如何获取产品的名称属性。
那我们如何知道某一属性值存储在哪张表中呢?幸好Magento遵循一套命名系统来对表格过行命名,如果您查看Magento数据库的表格的话,会发现很多以catalog_product_entity为前缀的表格:

  • catalog_product_entity
  • catalog_product_entity_datetime
  • catalog_product_entity_decimal
  • catalog_product_entity_int
  • catalog_product_entity_text
  • catalog_product_entity_varchar
  • catalog_product_entity_gallery
  • catalog_product_entity_media_gallery
  • catalog_product_entity_tier_price

虽然有了这么多表格,我们似乎还是不知道通过查询哪张表来获取产品名称属性。其实在前面的学习中我们已经给出了答案,就是在前面提到的eav_attribute表中有一列backend_type。Magento的EAV系统会按照属性的后台类型来将属性存储在不同的表格中。比如想要获后台中产品名称类型的话,可以运行如下查询语句:

SELECT * FROM <code>eav_attribute</code>
WHERE <code>entity_type_id</code> =4 AND <code>attribute_code</code> = 'name';

大家应该很轻易地看出其后台类型为varchar,那么这一属性值就存放在catalog_product_entity_varchar表中,下面就让我们一起来看看这张表的结构:
Magento如何获取数据
how-to-retrieve-data-on-magento表由六列组成:

  • value_id:此项属性值为唯一标识符和主键
  • entity_type_id:该值为实体类型ID
  • attribute_id:这是一个外键(foreign key),与eav_entity表中的值相对应
  • store_id:与店铺视图(storeview)属性值相匹配的一个外键
  • entity_id:该外键对应相应类型的实体表,本例中对应catalog_product_entity表
  • value:该项包含我们所需要获取的值

现在我们已经了解了所有需获取产品信息的表格,就可以创建如下查询语句:

SELECT p.entity_id AS product_id, var.value AS product_name, p.sku AS
product_sku
FROM catalog_product_entity p, eav_attribute eav, catalog_product_
entity_varchar var
WHERE p.entity_type_id = eav.entity_type_id
AND var.entity_id = p.entity_id
AND eav.attribute_code = 'name'
AND eav.attribute_id = var.attribute_id

执行该语句后,我们会获得一个包含product_id, product_name和product_sku三列内容的表格。可以看到,通过原生的SQL语句,需要书写5行SQL查询语句来获取产品名称和SKU这两列的内容。所以如果没有ORM系统,运维Magento将是一个艰巨的任务,有了ORM系统,通常您都不需要通过原生的SQL语句来与Magento数据库打交道。
既然如此,那让我们一起来看看通过Magento的ORM系统又是如何获取产品信息的:

  1. 第一步是实例化一个产品集合:
    $collection = Mage::getModel('catalog/product')->getCollection();
  2. 然后指定需要获取的产品名属性
    $collection->addAttributeToSelect('name');
  3. 通过name对该集合进行排序
    $collection->setOrder('name', 'asc');

     

  4. 让Magento加载该集合
    $collection->load();
  5. 最终获取到的结果是一个通过name排序的所有店铺商品的集合,可以通过运行如下语句来查看真正需要用到的SQL查询语句
    echo $collection->getSelect()->__toString();

仅仅通过3行代码就可以从Magento店铺中获取产品名称的数据,并通过name对产品进行排序。实际由Magento生成的查询语句如下:

SELECT <code>e</code>.*. IF( at_name.value_id &gt; 0, at_name.value, at_name_default.
value ) AS <code>name</code>
FROM <code>catalog_product_entity</code> AS <code>e</code>
LEFT JOIN <code>catalog_product_entity_varchar</code> AS <code>at_name_default</code> ON
(<code>at_name_default</code>.<code>entity_id</code> = <code>e</code>.<code>entity_id</code>)
AND (<code>at_name_default</code>.<code>attribute_id</code> = '65')
AND <code>at_name_default</code>.<code>store_id</code> =0
LEFT JOIN <code>catalog_product_entity_varchar</code> AS <code>at_name</code> ON ( <code>at_
name</code>.<code>entity_id</code> = <code>e</code>.<code>entity_id</code> )
AND (<code>at_name</code>.<code>attribute_id</code> = '65')
AND (<code>at_name</code>.<code>store_id</code> =1)
ORDER BY <code>name</code> ASC

可以看出ORM系统和EAV模型非常的强大,使得开发者具备极强的灵活性,同时使用方法也很简便。下一节我们一起来学习一下有关Magento集合的相关知识。

喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址