Alan Hou的个人博客

Magento ORM与数据集合

集合(collection)和模型(model)对于Magento的开发来说就像是一日三餐一样不可或缺。接下来我们会讲解Magento的ORM系统(Object Relational Mapping-对象关系映射),并学习如何正确地使用数据集合以及EAV系统。Magento像大多的当代系统一样使用了对象关系映射(ORM)。
对象关系映射(Object-relational mapping,常缩写为ORM,O/RM或O/R mapping)是一种将类型相互不兼容的系统间面向对象编程语言数据进行相互转化的计算机软件。它创建一个”虚拟对象数据库”(virtual object database)以供编程语言在内部使用。
在后面的文章中,我们会着重讲解:

我们还会使用一些代码来创建一个简易框架以供实验
首先下载https://github.com/amacgregor/mdg_imc文件然后上传到Magento的根目录,如果您在Linux上安装了GitHub的话(yum install git -y)的话,可以直接使用git clone https://github.com/amacgregor/mdg_imc.git将文件下载到当前目录,再拷贝整个shell文件夹到Magento根目录。
然后cd到Magento根目录,执行shell/imc.php,如果执行成功的话,会出现magento >字样。

Magento模型解析

前面已经讲到,Magento的数据模型用于操作和获取数据,数据层分为简单模型和EAV两种:

注:并非所有的Magento模型都通过ORM来进行继承。Observer就是例子,这种简易模型类并不映射某一特定数据库表或实体。
除此之外,每个模型类型由如下层组成:

Magento模型并不包含与数据库连接的逻辑,它们是并不了解数据库,事实上连接数据库的代码存放在资源模型层中。这使得Magento可以兼容多种类型的数据库和平台。尽管当前只正式支持MySQL,但却可以重写一个针对其它数据库的资源类,而无需修改其它模型逻辑代码。


下面我们通过实例化一个产品对象并设置一些产品的属性来进行进一步的了解:

  1. 打开刚刚添加的Magento互动控制器(即前述的magento >界面)
    cd /var/www/html
    php shell/imc.php
  2. 第一步输入如下指令来创建一个新的产品对象实例
    $product = Mage::getModel(‘catalog/product’);
  3. 通过如下指令可查看这个产品类是否为空实例
    echo get_class($product);
  4. 如果运行正常的话您将得到如下内容:
    Magento_Catalog_Model_Product
  5. 如果我们想要深入了解该类的方法的话,可以运行如下指令:
    print_r(get_class_methods($product));

该指令将返回一个包含该类中所有方法的数组,下面让我们通过运行如下代码来修改产品价格和名称:

$product = Mage::getModel('catalog/product')->load(2);
$name = $product->getName() . '-TEST';
$price = $product->getPrice();
$product->setPrice($price + 15);
$product->setName($name);
$product->save();

上面第一行代码会实例化一个具体对象,然会从对象中获取name属性,之后设置价格和名称,最终保存对象。
如果您打开Magento产品类Mage_Catalog_Model_Product (app/code/core/Mage/Catalog/Model/product.php),首先就会看到该类中定义了getName()和getPrice()方法,却没有setPrice()和setName()方法。那么Magento使用什么方法定义产品对象setter和getter方法的呢?虽然定义了getPrice()和getName()方法,但却没有定义color或manufacturer等产品属性的getter和setter方法。那么下一节我们就一起来看看Magento的魔术方法

退出移动版