有网友问我两者之间的区别,也许应该去用用Rails框架。Rails中将每一个数据表对应一个类,类的每个对象实例对应于数据库中表的一行记录,表中每个字段都是类的一个属性。
ActiveRecord一般会出现如下代码:
- <?php
- //返回所以user_id为1的博客文章列表
- $where = array(
- 'user_id' => 1,
- );
- $blogs = Blog::find('all',$where);
- foreach($blogs as $blog){
- echo sprintf("ID:%d<br>Title:%s",$blog->id,$blog->title);
- }
- ?>
ActiveRecord返回的是一个对象数组,其实就是每个数据表中的行对应一个对象,同时负责把该对象持久化. 在ActiveRecord中封装了对数据库的操作(如CRUD操作),示例:
- <?php
- //返回所以user_id为1的博客文章列表
- $where = array(
- 'user_id' => 1,
- );
- $blogs = Blog::find('all',$where);
- //将点击数加1
- foreach($blogs as $blog){
- $blog->set('total_views','(total_views)+1');
- $blog->save();
- }
- ?>
而TableGateWay呢,我们可以把它看做一种数据访问模式,每个表对应一个类,类的方法封装了对单个表的数据操作。比如:
- <?php
- //返回所以user_id为1的博客文章列表
- $where = array(
- 'user_id' => 1,
- );
- $mBlog = new Blog();
- $blogs = $mBlog->findAll($where);
- foreach($blogs as $blog){
- echo sprintf("ID:%d<br>Title:%s",$blog['id'],$blog['title']);
- }
- ?>
如果我们要更新Blog Model怎么办呢?这是其实TableGateWay要比ActiveRecord更简单更高效。比如我们同样要将所有user_id为1的博客文章的点击数加1,TableGateWay允许批量操作,而ActiveRecord需要先将对象取出来然后才能进行更新。
- <?php
- //返回所以user_id为1的博客文章列表
- $where = array(
- 'user_id' => 1,
- );
- $mBlog = new Blog();
- $mBlog->update(array('total_views'=>'(total_views)+1'),$where);
- ?>
ActiveRecord的对象中保持的是数据库单行记录的值,是有状态的对象,而TableGateway无状态可言,只是一系列数据记录的访问方法的聚合,它返回的是数组数据。
在实际应用中,ActiveRecord适用于业务逻辑比较简单的系统,即你的业务逻辑大多数十单表操作的应用系统;当发生跨表操作的时候,如果对象间关联较多,就会造成事物脚本庞大,代码的冗余就比较高;所以ROR对于小型的WEB快速开发者而言,是不错的选择。而TableGateWay相对于ActiveRecord而言更接近传统PHP开发的思维模式,它的表数据入口针对的是一个表封装数据库操作,处理批量数据时比较方便,性能也较高,实现起来也是很简单的,结合Table Module(表模块)模式来封装业务逻辑的话,可以将数据库底层操作和真正的业务逻辑分离开来;但是它在面向对象方面不如ActiveRecord了,无法像ActiveRecord一样以属性形势封装数据,单行操作时不如ActiveRecord方便。总之仁者见仁智者见智…各有各的选择吧!
原文地址:http://www.kokkowon.com 欢迎交流!