ThinkPHP提供了灵活和方便的数据操作方法,对数据库操作的四个基本操作(CURD):创建、更新、读取和删除的实现是php学习最基本的,也是必须掌握的,在这基础之上才能熟悉更多实用的数据操作方法。CURD操作通常是可以和连贯操作配合完成的。下面来分析下各自的用法:
(下面的CURD操作我均以M方法创建模型实例来说明,因为不涉及到具体的业务逻辑)
一、创建操作
在ThinkPHP使用add方法新增数据到数据库。
使用方法如下:
$User = M(“User”); // 实例化User对象
$data['name'] = ‘ThinkPHP’;
$data['email'] = ‘phpboke@163.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'] = ‘phpboke@163.com’;
$User->where(‘id=5′)->save($data); // 根据条件保存修改的数据
为了保证数据库的安全,避免出错更新整个数据表,如果没有任何更新条件,数据对象本身也不包含主键字段的话,save方法不会更新任何数据库的记录。
因此下面的代码不会更改数据库的任何记录
$User->save($data);
除非使用下面的方式:
$User = M(“User”); // 实例化User对象
// 要修改的数据对象属性赋值
$data['id'] = 5;
$data['name'] = ‘ThinkPHP’;
$data['email'] = ‘phpboke@163.com’;
$User->save($data); // 根据条件保存修改的数据
如果id是数据表的主键的话,系统自动会把主键的值作为更新条件来更新其他字段的值。
还有一种方法是通过create或者data方法创建要更新的数据对象,然后进行保存操作,这样save方法的参数可以不需要传入。
$User = M(“User”); // 实例化User对象
// 要修改的数据对象属性赋值
$data['name'] = ‘ThinkPHP’;
$data['email'] = ‘phpboke@163.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();
在php学习过程中,经常查看手册和对应的ThinkPHP手册,时间长了就会对php运用自如。