根据前面的学习,我们已经成功获取产品实体及其特定的一些属性,下面就该看看如何获取直实的值了。为简化起见,这里仅介绍如何获取产品的名称属性。
那我们如何知道某一属性值存储在哪张表中呢?幸好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表中,下面就让我们一起来看看这张表的结构:
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系统又是如何获取产品信息的:
- 第一步是实例化一个产品集合:
$collection = Mage::getModel('catalog/product')->getCollection();
- 然后指定需要获取的产品名属性
$collection->addAttributeToSelect('name');
- 通过name对该集合进行排序
$collection->setOrder('name', 'asc');
- 让Magento加载该集合
$collection->load();
- 最终获取到的结果是一个通过name排序的所有店铺商品的集合,可以通过运行如下语句来查看真正需要用到的SQL查询语句
echo $collection->getSelect()->__toString();
仅仅通过3行代码就可以从Magento店铺中获取产品名称的数据,并通过name对产品进行排序。实际由Magento生成的查询语句如下:
SELECT <code>e</code>.*. IF( at_name.value_id > 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集合的相关知识。