ActiveRecord OR TableGateway

来源:互联网 发布:无主之地2人工智能 编辑:程序博客网 时间:2024/06/04 01:26

有网友问我两者之间的区别,也许应该去用用Rails框架。Rails中将每一个数据表对应一个类,类的每个对象实例对应于数据库中表的一行记录,表中每个字段都是类的一个属性。
ActiveRecord一般会出现如下代码:

  1. <?php
  2. //返回所以user_id为1的博客文章列表
  3. $where = array(
  4.     'user_id' =>1,
  5. );
  6. $blogs = Blog::find('all',$where);
  7. foreach($blogs as$blog){
  8.     echo sprintf("ID:%d<br>Title:%s",$blog->id,$blog->title);
  9. }
  10. ?>

ActiveRecord返回的是一个对象数组,其实就是每个数据表中的行对应一个对象,同时负责把该对象持久化. 在ActiveRecord中封装了对数据库的操作(如CRUD操作),示例:

  1. <?php
  2. //返回所以user_id为1的博客文章列表
  3. $where = array(
  4.     'user_id' =>1,
  5. );
  6. $blogs = Blog::find('all',$where);
  7. //将点击数加1
  8. foreach($blogs as$blog){
  9.     $blog->set('total_views','(total_views)+1');
  10.     $blog->save();
  11. }
  12. ?>

而TableGateWay呢,我们可以把它看做一种数据访问模式,每个表对应一个类,类的方法封装了对单个表的数据操作。比如:

  1. <?php
  2. //返回所以user_id为1的博客文章列表
  3. $where = array(
  4.     'user_id' =>1,
  5. );
  6. $mBlog = new Blog();
  7. $blogs = $mBlog->findAll($where);
  8. foreach($blogs as$blog){
  9.     echo sprintf("ID:%d<br>Title:%s",$blog['id'],$blog['title']);
  10. }
  11. ?>

如果我们要更新Blog Model怎么办呢?这是其实TableGateWay要比ActiveRecord更简单更高效。比如我们同样要将所有user_id为1的博客文章的点击数加1,TableGateWay允许批量操作,而ActiveRecord需要先将对象取出来然后才能进行更新。

  1. <?php
  2. //返回所以user_id为1的博客文章列表
  3. $where = array(
  4.     'user_id' =>1,
  5. );
  6. $mBlog = new Blog();
  7. $mBlog->update(array('total_views'=>'(total_views)+1'),$where);
  8. ?>

ActiveRecord的对象中保持的是数据库单行记录的值,是有状态的对象,而TableGateway无状态可言,只是一系列数据记录的访问方法的聚合,它返回的是数组数据。

在实际应用中,ActiveRecord适用于业务逻辑比较简单的系统,即你的业务逻辑大多数十单表操作的应用系统;当发生跨表操作的时候,如果对象间关联较多,就会造成事物脚本庞大,代码的冗余就比较高;所以ROR对于小型的WEB快速开发者而言,是不错的选择。而TableGateWay相对于ActiveRecord而言更接近传统PHP开发的思维模式,它的表数据入口针对的是一个表封装数据库操作,处理批量数据时比较方便,性能也较高,实现起来也是很简单的,结合Table Module(表模块)模式来封装业务逻辑的话,可以将数据库底层操作和真正的业务逻辑分离开来;但是它在面向对象方面不如ActiveRecord了,无法像ActiveRecord一样以属性形势封装数据,单行操作时不如ActiveRecord方便。总之仁者见仁智者见智…各有各的选择吧!
原文地址:http://www.kokkowon.com 欢迎交流!

0 0