`
yipsilon
  • 浏览: 242244 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

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

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

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

1. 更简化的对象配置:直接在PHP对象的property中进行定义映射信息。
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');
  }
}

上面的代码就是定义简单的关系映射信息,构造函数里的代码是把当前对象添加到对象注册表中与数据表关联。如果您不想在构造方法中绑定数据表,可以在其他地方使用下面的代码来实现同样功能:
CmspadObject::bind('BankObject', 'cmspad_bank_info');

好了,这两步已经做完了,下面可以开始使用该对象了:
$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的名称字段,该字段已在映射中定义
... ...

至此,简单的数据表映射配置完成了。下面看看更高级的特性...

2. 关系映射进阶:当前实现,支持一对一、一对多关系,并支持延迟加载技术。
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
  );
}

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

3. 更高级的OQL查询语言:CMSPAD Object!提供了一个更强大的查询语言机制 - OOQL,类似于Hibernate的HQL。
$bankObj->query("FROM {BankObject} WHERE {BankObject.id} > 10 LIMIT 2,10");

值得注意的是,跟HQL一样,由于CMSPAD的Database库本身支持多种数据库(Oracle、MySQL、MSSql等),因此OOQL的LIMIT也是跨数据库的,而不仅仅作用在MySQL上。

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

相关推荐

Global site tag (gtag.js) - Google Analytics