数据创建
create方法创建数据对象
create()方法支持从其他方式创建数据对象,例如,其他数据对象或者是数组。
- 从User对象创建新的Member数据对象
$User = stdClass();
$User->name = 'ThinkPHP';
$User->email = 'ThinkPHP@gmail.com';
$Member = M("Member");
$Member->create($User);
- 从数组创建对象
$data['name'] = 'thinkphp';
$data['email'] = 'thinkphp@gmail.com';
$data['status'] = 1;
$User = M('User');
$data = $User->create($data);
创建失败,打出错误信息。
$User = D('User'); // 实例化User对象
if (!$User->create()) {
// 如果创建失败 表示验证没有通过 输出错误提示信息
$this->error($User->getError());
} else {
// 验证通过 可以进行其他数据操作
}
create方法的第二个参数可以指定创建数据的操作状态,默认情况下是自动判断是写入还是更新操作。系统内置的数据操作包括INSERT(1)和UPDATE(2),当没有指定的时候,系统根据数据源是否包含主键数据来自动判断,如果存在主键数据,就当成UPDATE操作。
$Member = M("User");
$Member->create($_POST,Model::MODEL_UPDATE);
create方法创建的数据对象是保存在内存中,并没有实际写入到数据库中,直到使用add或者save方法才会真正写入数据库。
$User = M('User');
$User->create(); //创建User数据对象
$User->status = 1; // 设置默认的用户状态
$User->create_time = time(); // 设置用户的创建时间
$User->add(); // 把用户对象写入数据库
把用户对象写入数据库create方法所做的工作很复杂,在创建数据对象的同时,完成了一系列的工作。我们熟悉的令牌验证、自动验证和自动完成功能,其实都必须通过create方法才能生效。
data方法创建简单的数据对象
如果只是想简单创建一个数据对象,并不需要完成一些额外的功能的话,可以使用data方法简单的创建数据对象。Data方法也支持传入数组和对象,使用data方法创建的数据对象不会进行自动验证和过滤操作,请自行处理。
$User = M('User');// 创建数据后写入到数据库
$data['name'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@gmail.com';
$User->data($data)->add();
数据写入
add方法插入一条数据
$User = M("User"); // 实例化User对象
$data['name'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@gmail.com';
$User->add($data);
如果写入了数据表中不存在的字段数据,则会被直接过滤。其中test字段是不存在的,所以写入数据的时候会自动过滤掉。
$data['name'] = 'thinkphp';
$data['email'] = 'thinkphp@gmail.com';
$data['test'] = 'test';
$User = M('User');
$User->data($data)->add();
如果写入结果$result数据非法则返回false,如果是自增主键 $result则返回主键值,否则返回1。
addAll方法插入批量数据
$User = M("User");
$dataList[] = array('name'=>'thinkphp','email'=>'thinkphp@gamil.com');
$dataList[] = array('name'=>'onethink','email'=>'onethink@gamil.com');
$User->addAll($dataList);
addAll返回的不是影响条数,也不是返回的所有写入的主键id集,而是返回的写入的第一条数据的主键值。
该功能需要3.2.3以上版本,3.2.3以下版本仅对mysql数据库支持
数据读取
find读取数据
如果查询出错,find方法返回false,如果查询结果为空返回NULL,查询成功则返回一个关联数组(复合条件的第一条记录)。
$User = M("User"); // 实例化User对象
$data = $User->where('status=1 AND name="thinkphp"')->find();// 查找status值为1name值为think的用户数据
select读取数据集
如果查询出错,select的返回值是false,如果查询结果为空,则返回NULL,否则返回二维数组。
$User = M("User"); // 实例化User对象
$list = $User->where('status=1')->order('create_time')->limit(10)->select();// 查找status值为1的用户数据 以创建时间排序 返回10条数据
getField读取字段值
获取数据表中的某个列的多个或者单个数据,默认情况下,当只有一个字段的时候,返回满足条件的数据表中的该字段的第一行的值。
$User = M("User"); // 实例化User对象
$nickname = $User->where('id=3')->getField('nickname');// 获取ID为3的用户的昵称
需要返回整个列的数据,加一个参数true。
$User->getField('id',true); // 获取id数组
//返回数据格式如array(1,2,3,4,5)一维数组,其中value就是id列的每行的值
如果传入多个字段的话,默认返回一个关联数组。注意,即使缺少true参数,返回的也是全部行数的数据
$User = M("User"); // 实例化User对象// 获取所有用户的ID和昵称列表
$list = $User->getField('id,nickname');//两个字段的情况下返回的是array(`id`=>`nickname`)的关联数组。
getField方法还可以支持限制数量
$this->getField('id,name',5); // 限制返回5条记录
$this->getField('id',3); // 获取id数组 限制3条记录
数据更新
save方法更新数据
$User = M("User"); // 实例化User对象
$data['name'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@gmail.com';
$User->where('id=5')->save($data); // 根据条件更新记录
对象方式操作
$User = M("User"); // 实例化User对象
$User->name = 'ThinkPHP';
$User->email = 'ThinkPHP@gmail.com';
$User->where('id=5')->save(); // 根据条件更新记录
注意:save方法的返回值是影响的记录数,如果返回false则表示更新出错,因此一定要用恒等来判断是否更新失败。
如果id是数据表的主键的话,系统自动会把主键的值作为更新条件来更新其他字段的值。
$User = M("User"); // 实例化User对象
$data['id'] = 5;
$data['name'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@gmail.com';
$User->save($data); // 根据条件保存修改的数据
更新字段
更新个别字段的值,可以使用setField方法。
$User = M("User"); // 实例化User对象
$User-> where('id=5')->setField('name','ThinkPHP');// 更改用户的name值
setField方法支持同时更新多个字段,只需要传入数组即可。
$User = M("User"); // 实例化User对象
$data = array('name'=>'ThinkPHP','email'=>'ThinkPHP@gmail.com');
$User-> where('id=5')->setField($data);// 更改用户的name和email的值
统计字段(通常指的是数字类型)的更新,系统还提供了setInc和setDec方法。
$User = M("User"); // 实例化User对象
$User->where('id=5')->setInc('score',3); // 用户的积分加3
$User->where('id=5')->setInc('score'); // 用户的积分加1
$User->where('id=5')->setDec('score',5); // 用户的积分减5
$User->where('id=5')->setDec('score'); // 用户的积分减1
数据删除
删除一条数据
$User = M("User"); // 实例化User对象
$User->delete(5); // 删除主键为5的用户数据
delete方法可以删除单个数据,也可以删除多个数据,这取决于删除条件。
$User = M("User"); // 实例化User对象
$User->where('id=5')->delete(); // 删除id为5的用户数据
$User->delete('1,2,5'); // 删除主键为1,2和5的用户数据
$User->where('status=0')->delete(); // 删除所有状态为0的用户数据
为了避免错删数据,如果没有传入任何条件进行删除操作的话,不会执行删除操作
delete方法的返回值是删除的记录数,如果返回值是false则表示SQL出错,返回值如果为0表示没有删除任何数据。