ThinkPHP 实现了 ActiveRecords 模式的 ORM 模型,采用了非标准的 ORM 模型:表映射到类,记录(集)映射到对象,字段属性映射到对象的虚拟属性 。最大的特点就是使用方便,从而达到敏捷开发的目的。
开发过程中,只需要定义好模型类就可以进行方便的数据操作了,例如我们定义了一个 UserModel 类:
class UserModel extends Model {
}
甚至无需增加任何属性和方法,我们就可以进行下面的操作了。
$User = D ( “User” ); // 实例化 User 对象
// 或者 $User = new UserModel();
$User -> find ( 1 ); // 查找 id 为 1 的记录
$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 方法。
// 查询主键为 1 、 3 、 8 的记录集
$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′ ); // 删除主键为 5 、 6 的数据
$User -> deleteAll (); // 删除查询出来的所有数据
注意事项
在 ThinkPHP 里面 AR 模式和普通模式结合起来使用,根据实际的项目需要。因此有时候,也不要拘泥于 AR 模式的操作 ~