当前位置: 首页 > 工具软件 > CMSPAD > 使用案例 >

只有一个文件的ORM工具包:CMSPAD Object!

邹玮
2023-12-01
前段时间我们在项目选型中选择了EZPDO作为ORM工具,但其运行效率之低确实也让我们汗颜。于是,我们开设了一个新的项目组专门来为CMSPAD研发ORM工具包,目的是提供一个更简化的类ActiveRecord模式的ORM工具,命名为“CMSPAD Object!”。

目前,它已经可以做很多事情了,下面我来说说CMSPAD Object!的一些特性:

1. 更简化的对象配置:直接在PHP对象的property中进行定义映射信息。
[code]class BankObject extends CmspadObject{
public $id = array(
'column' => 'b_id',
'type' => 'integer',
'key' => true
);

public $name = array(
'column' => 'b_name',
'type' => 'string',
'null' => false
);

public $recommend = array(
'column' => 'b_recommend',
'type' => 'integer'
);

public function __construct(){
CmspadObject::bind($this, 'cmspad_bank_info');
}
}[/code]
上面的代码就是定义简单的关系映射信息,构造函数里的代码是把当前对象添加到对象注册表中与数据表关联。如果您不想在构造方法中绑定数据表,可以在其他地方使用下面的代码来实现同样功能:
[code]CmspadObject::bind('BankObject', 'cmspad_bank_info');[/code]
好了,这两步已经做完了,下面可以开始使用该对象了:
[code]$bankObj = new BankObject();
$banks1 = $bankObj->findAll(); //查找所有的银行, 返回银行对象的数组
$bank1 = $bankObj->find("{name} = '招商银行'"); // 查找名字为“招商银行”的银行
$banks2 = $bankObj->findAllByRecommend(5); // 查找所有推荐级别为5的银行
$bank2 = $bankObj->findById(1); // 查找ID为1的银行
$bankName = $bank1->getName(); // 获得bank1的名称字段,该字段已在映射中定义
... ...
[/code]
至此,简单的数据表映射配置完成了。下面看看更高级的特性...

2. 关系映射进阶:当前实现,支持一对一、一对多关系,并支持延迟加载技术。
[code]class BankObject extends CmspadObject{
public $id = array(
'column' => 'b_id',
'type' => 'integer',
'key' => true
);

public $name = array(
'column' => 'b_name',
'type' => 'string',
'null' => false
);

public $cards = array{
'column' => 'b_id',
'type' => 'BankCardObject.bank',
'relation' => 'many'
}
}
class BankCardObject extends CmspadObject{
public $id = array(
'column' => 'bc_id',
'type' => 'integer',
'key' => true
);

public $name = array(
'column' => 'bc_name',
'type' => 'string',
'null' => false
);

public $bank = array(
'column' => 'bc_bank',
'type' => 'BankObject',
'relation' => 'one',
'lazy' => true
);
}[/code]
上面的代码包含了一对一、一对多和延迟加载的配置信息:一家银行中可以发行多个银行卡,而每个银行卡只能对应一家银行。
当调用 $bankObj->getCards() 方法时,返回的是一个 BankCardObject 类型的对象数组,由于 BankObject.cards 属性没有设置懒加载标记,每次使用findXXX查询时都会一次性载入。而 BankCardObject.bank 属性设置了懒加载标记,只有当调用 $bankCardObj->getBank() 方法时,才会加载 BankObject 对象。

3. 更高级的OQL查询语言:CMSPAD Object!提供了一个更强大的查询语言机制 - OOQL,类似于Hibernate的HQL。
[code]$bankObj->query("FROM {BankObject} WHERE {BankObject.id} > 10 LIMIT 2,10");[/code]
值得注意的是,跟HQL一样,由于CMSPAD的Database库本身支持多种数据库(Oracle、MySQL、MSSql等),因此OOQL的LIMIT也是跨数据库的,而不仅仅作用在MySQL上。

如同其他子项目差不多,该项目目前是个内部评估版,待到我们把所有需要实现的特性目标制定好后,该项目将在PHP领域上寻求高效映射的平衡点,为提高大家的开发效率和程序的运行效率而努力。:)
 类似资料: