ThinkPHP 提供了灵活和方便的数据操作方法,对数据库操作的四个基本操作( CURD ):创建、更新、读取和删除的实现是最基本的,也是必须掌握的,在这基础之上才能熟悉更多实用的数据操作方法。 CURD 操作通常是可以和连贯操作配合完成的。下面来分析下各自的用法:
(下面的 CURD 操作我们均以 M 方法创建模型实例来说明,因为不涉及到具体的业务逻辑)
一、创建操作
在 ThinkPHP 使用 add 方法新增数据到数据库。
使用方法如下:
$User = M( "User" ); // 实例化 User 对象
$data ['name'] = 'ThinkPHP';
$data ['email'] = 'ThinkPHP@gmail.com';
$User->add($data);
或者使用 data 方法连贯操作
$User->data($data)->add();
如果在 add 之前已经创建数据对象的话(例如使用了 create 或者 data 方法), add 方法就不需要再传入数据了。
使用 create 方法的例子:
$User = M( "User" ); // 实例化 User 对象
// 根据表单提交的 POST 数据创建数据对象
$User->create();
$User->add(); // 根据条件保存修改的数据
如果你的主键是自动增长类型,并且如果插入数据成功的话, Add 方法的返回值就是最新插入的主键值,可以直接获取。
二、读取数据
在 ThinkPHP 中读取数据的方式很多,通常分为读取数据和读取数据集。
读取数据集使用 findall 或者 select 方法( findall 和 select 方法等效):
$User = M( "User" ); // 实例化 User 对象
// 查找 status 值为 1 的用户数据 以创建时间排序 返回 10 条数据
$list = $User->where( 'status=1' )->order( 'create_time' )->limit(10)->select();
select 方法的返回值是一个二维数组,如果没有查询到任何结果的话,也是返回一个空的数组。配合上面提到的连贯操作方法可以完成复杂的数据查询。而最复杂的连贯方法应该是 where 方法的使用,因为这部分涉及的内容较多,我们会在查询语言部分就如何进行组装查询条件进行详细的使用说明。基本的查询暂时不涉及关联查询部分,而是统一采用关联模型来进行数据操作,这一部分请参考关联模型部分。
读取数据使用 find 方法:
读取数据的操作其实和数据集的类似, select 可用的所有连贯操作方法也都可以用于 find 方法,区别在于 find 方法最多只会返回一条记录,因此 limit 方法对于 find 查询操作是无效的。
$User = M( "User" ); // 实例化 User 对象
// 查找 status 值为 1name 值为 think 的用户数据
$User->where( 'status=1 AND name="think" ' )->find();
即使满足条件的数据不止一条, find 方法也只会返回第一条记录。
如果要读取某个字段的值,可以使用 getField 方法,例如:
$User = M( "User" ); // 实例化 User 对象
// 获取 ID 为 3 的用户的昵称
$nickname = $User->where( 'id=3' )->getField( 'nickname' );
当只有一个字段的时候,始终返回一个值。
如果传入多个字段的话,可以返回一个关联数组:
$User = M( "User" ); // 实例化 User 对象
// 获取所有用户的 ID 和昵称列表
$list = $User->getField( 'id,nickname' );
返回的 list 是一个数组,键名是用户的 id , 键值是用户的昵称 nickname 。
三、更新数据
在 ThinkPHP 中使用 save 方法更新数据库,并且也支持连贯操作的使用。
$User = M( "User" ); // 实例化 User 对象
// 要修改的数据对象属性赋值
$data ['name'] = 'ThinkPHP';
$data ['email'] = 'ThinkPHP@gmail.com';
$User->where( 'id=5' )->save($data); // 根据条件保存修改的数据
为了保证数据库的安全,避免出错更新整个数据表,如果没有任何更新条件,数据对象本身也不包含主键字段的话, save 方法不会更新任何数据库的记录。
因此下面的代码不会更改数据库的任何记录
$User->save($data);
除非使用下面的方式:
$User = M( "User" ); // 实例化 User 对象
// 要修改的数据对象属性赋值
$data ['id'] = 5;
$data ['name'] = 'ThinkPHP';
$data ['email'] = 'ThinkPHP@gmail.com';
$User->save($data); // 根据条件保存修改的数据
如果 id 是数据表的主键的话,系统自动会把主键的值作为更新条件来更新其他字段的值。
还有一种方法是通过 create 或者 data 方法创建要更新的数据对象,然后进行保存操作,这样 save 方法的参数可以不需要传入。
$User = M( "User" ); // 实例化 User 对象
// 要修改的数据对象属性赋值
$data ['name'] = 'ThinkPHP';
$data ['email'] = 'ThinkPHP@gmail.com';
$User->where( 'id=5' )->data($data)->save(); // 根据条件保存修改的数据
使用 create 方法的例子:
$User = M( "User" ); // 实例化 User 对象
// 根据表单提交的 POST 数据创建数据对象
$User->create();
$User->save(); // 根据条件保存修改的数据
上面的情况,表单中必须包含一个以主键为名称的隐藏域,才能完成保存操作。
如果只是更新个别字段的值,可以使用 setField 方法:
$User = M( "User" ); // 实例化 User 对象
// 更改用户的 name 值
$User-> where( 'id=5' )-> setField( 'name','ThinkPHP' );
setField 方法支持同时更新多个字段,只需要传入数组即可,例如:
$User = M( "User" ); // 实例化 User 对象
// 更改用户的 name 和 email 的值
$User-> where( 'id=5' )-> setField(array( 'name','email' ),array( 'ThinkPHP','ThinkPHP@gmail.com' ));
而对于统计字段(通常指的是数字类型)的更新,系统还提供了 setInc 和 setDec 方法:
$User = M( "User" ); // 实例化 User 对象
$User->setInc( 'score','id=5',3 ); // 用户的积分加 3
$User->setInc( 'score','id=5' ); // 用户的积分加 1
$User->setDec( 'score','id=5',5 ); // 用户的积分减 5
$User->setDec( 'score','id=5' ); // 用户的积分减 1
四、删除数据
在 ThinkPHP 中使用 delete 方法删除数据库中的记录。同样可以使用连贯操作进行删除操作。
$User = M( "User" ); // 实例化 User 对象
$User->where( 'id=5' )->delete(); // 删除 id 为 5 的用户数据
$User->where( 'status=0' )->delete(); // 删除所有状态为 0 的用户数据
delete 方法可以用于删除单个或者多个数据,主要取决于删除条件,也就是 where 方法的参数,也可以用 order 和 limit 方法来限制要删除的个数,例如:
// 删除所有状态为 0 的 5 个用户数据 按照创建时间排序
$User->where( 'status=0' )->order( 'create_time' )->limit( '5' )->delete();