注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

thinkphp ActiveRecord  

2009-11-17 16:10:09|  分类: thinkphp |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

ActiveRecord

ThinkPHP实现了ActiveRecords模式的ORM模型,采用了非标准的ORM模型:表映射到类,记录(集)映射到对象,字段属性映射到对象的虚拟属性。最大的特点就是使用方便,从而达到敏捷开发的目的。
开发过程中,只需要定义好模型类就可以进行方便的数据操作了,例如我们定义了一个UserModel类:

class UserModel extends Model{

}

甚至无需增加任何属性和方法,我们就可以进行下面的操作了。

$User D("User"); // 实例化User对象

// 或者 $User = new UserModel();

$User->find(1); // 查找id1的记录

$User->name 'ThinkPHP'// 把查找到的记录的名称字段修改为ThinkPHP

$User->save(); // 保存修改的数据

ActiveRecord模式更加高级的是,ThinkPHP可以把记录集映射到对象,例如

$User->findAll();

foreach ($User as $user){

  echo $user->name;// 可以结合配置来使用 $user['name']

}

 

ThinkPHP提供了灵活和方便的数据操作方法,不仅实现了对数据库操作的四个基本操作(CURD):创建、读取、更新和删除的实现,还内置了很多实用的数据操作方法,提供了ActiveRecords模式的最佳体验。

新建记录

// 实例化一个User模型对象

$User = new UserModel();

// 然后给数据对象赋值

$User->name 'ThinkPHP';

$User->email 'ThinkPHP@gmail.com';

// 然后就可以保存新建的User对象了

$User->add();

// 如果需要锁实例化模型对象的时候传入数据,可以使用

$data['name'] = 'ThinkPHP';

$data['email'] = 'ThinkPHP@gmail.com';

$User = new UserModel($data);

$User->add();

// 或者直接在add方法传入要新建的数据

$data['name'] = 'ThinkPHP';

$data['email'] = 'ThinkPHP@gmail.com';

$User = new UserModel();

$User->add($data);

如果你的主键是自动增长类型,不需要传入主键的值就可以新建数据,并且如果插入数据成功的话,Add方法的返回值就是最新插入的主键值,可以直接获取。

$insertId        =        $User->add($data);

一般情况下,应用中的数据对象不太可能通过手动赋值的方式写入,而是有个数据对象的创建过程。ThinkPHP提供了一个create方法来创建数据对象,然后进行其它的新增或者编辑操作。

$User D("User");

$User->create(); // 创建User数据对象,默认通过表单提交的数据进行创建

$User->add(); // 新增表单提交的数据

Create方法支持从其它方式创建数据对象,例如,从其它的数据对象,或者数组等

$data['name'] = 'ThinkPHP';

$data['email'] = 'ThinkPHP@gmail.com';

$User->create($data);

// User数据对象创建新的Member数据对象

$Member D("Member");

$Member->create($User);

支持新增多条记录

$User = new UserModel();

$data[0]['name'] = 'ThinkPHP';

$data[0]['email'] = 'ThinkPHP@gmail.com';

$data[1]['name'] = '流年';

$data[1]['email'] = 'liu21st@gmail.com';

$User->addAll($data);

MySql数据库下面,会自动使用一条SQL语句实现多数据的插入。

查询记录
读取数据库的记录我觉得是数据库操作中的最有意思的一件事情了,写过文本数据库的人都知道,保存和删除数据不难(无非是规范和效率问题),难在可以通过各种方式来查找需要的数据。ThinkPHP通过各种努力,让数据库的查询操作变得轻而易举,也让ThinkPHP变得富有内涵。
ThinkPHP
有一个非常明确的约定,就是单个数据查询和多个数据查询的方法是分开的,或者你会认为有时候自己也不知道要查询的数据是单个还是多个,但是有一点是明确的,你需要的是返回一个数据还是希望返回的是一个数据集。因为对两种类型的返回数据的操作方式是截然不同的,无论何种方式的返回,我们都可以直接在模型对象里面操作,当然也一样可以作为数据传递给你需要的变量。
先举个最简单的例子,假如我们要查询主键为8的某个用户记录,我们可以使用下面的一些方法:

$User->find(8);

这个作为查询语言来说是最为直观的,如果查询成功,查询的结果直接保存在当前的数据对象中,在进行下一次查询操作之前,我们都可以提取,例如获取查询的结果数据:

$name $User->name;

$email $User->email;

遍历查询到的数据对象属性

foreach ($User as $key=>$val){

        echo($key.':'.$val);

}

// 或者进行相关的数据更改和保存操作
也可以用变量保存下来以便随时使用。

$user $User->find(8);

对于上面的查询条件,我们还可以使用getById来完成相同的查询

$User->getById(8);

需要注意的是,对于find方法来说,即使查询结果有多条记录,也只会返回符合条件的第一条记录,如果要返回符合要求的所有记录,请使用findAll方法。
//
查询主键为138的记录集

$User->findAll('1,3,8'); 

// 遍历数据列表

foreach ($User as $vo){

        dump($vo->name);

}

更多的查询操作请参考后面章节的内容。
        
更新记录
了解了查询记录后,更新操作就显得非常简单了。

$User->find(1); // 查找主键为1的数据

$User->name 'TOPThink'// 修改数据对象

$User->save(); // 保存当前数据对象

// 还可以使用下面的方式更新

$User->score '(score+1)'// 对用户的积分加1

$User->save();

如果不是使用数据对象的方式来保存,可以传入要保存的数据和条件

$data['id'] = 1;

$data['name'] = 'TopThink';

$User->save($data);

除了save方法外,你还可以使用setField方法来更新特定字段的值,例如:

$User->setField('name','TopThink','id=1');

同样可以支持对字段的操作

$User->setField('score','(score+1)','id=1');

// 或者改成下面的

$User->setInc('score','id=1');

删除记录

$User->find(2);

$User->delete(); // 删除查找到的记录

$User->delete('5,6'); // 删除主键为56的数据

$User->deleteAll(); // 删除查询出来的所有数据

注意事项
ThinkPHP里面AR模式和普通模式结合起来使用,根据实际的项目需要。因此有时候,也不要拘泥于AR模式的操作~

  评论这张
 
阅读(817)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017