ThinkPHP之增删改查

1、创建数据对象

根据表单数据创建数据对象

$User = M('User');// 实例化User模型
$User->create();// 根据表单提交的POST数据创建数据对象

2、数据写入

具体参考http://document.thinkphp.cn/manual_3_2.html#insert_data
数据写入操作使用add方法

<?php
$User = M("User"); // 实例化User对象
$data['name'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@gmail.com';
$id = $User->add($data); //返回新增数据的主键(id)
if(!$id){
     return '新增入库单记录失败!';
}
?>

3、数据删除

具体参考http://document.thinkphp.cn/manual_3_2.html#delete_data
delete方法的返回值是删除的记录数,如果返回值是false则表示SQL出错,返回值如果为0表示没有删除任何数据

//可以用where条件,也可以往delete()方法传入主键
$User = M("User"); // 实例化User对象
$User->delete('1,2,5'); // 删除主键为1,2和5的用户数据
$User->where('id=5')->delete(); // 删除id为5的用户数据
$User->where('status=0')->delete(); // 删除所有状态为0的用户数据

为了避免错删数据,如果没有传入任何条件进行删除操作的话,不会执行删除操作

$User = M("User"); // 实例化User对象
$User->delete(); 

如果你确实要删除所有的记录,如下

$User = M("User"); // 实例化User对象
$User->where('1')->delete(); 

以下3个例子涉及到的两张表的关系
主表入库表StockIn,从表入库明细表StockInDetail
外键关系StockInDetail.stockinid = StockIn.id
例1.级联删除
要求:在删除入库表的一条记录时,把该入库记录的明细也删除

 $stockInModel= M('StockIn'); 
 $stockInModel->startTrans();//开启事务
 $stockInDetModel = M('StockInDetail'); 

 $delDetailRes = $stockInDetModel->where(array('stockinid'=>array('in',$ids)))->delete();//先删除从表记录
 $delMainRes = $stockInModel->where(array('id'=>array('in',$ids)))->delete(); //再删除主表记录

if(!$delDetailRes || !$delMainRes){//出错或删除失败事务回滚
    $model->rollback();
    return false;
}
$model->commit();//提交事务

例2.限制删除 要求:如果入库表的一条记录,被入库明细表关联了,则不允许删除

  //判断该入库表记录下有没有入库明细记录:$id是待删除的入库表记录id
 $mlist = D('StockInDetail')->where(array('stockinid'=>array('eq',$id)))->field('id')->select();
 if(!empty($mlist)){
     $this->error('该入库表已关联入库明细,不允许删除');
 }

例2.限制删除 要求:在删除一条入库表记录时,判断字段status是否为0,如果为0,则允许删除,status为1,则不允许删除

  // $ids是数组,存放所有待删除的主键id
  $model = M('StockIn');
  $record = $model->where(array('status'=>array('gt',0), 'id'=>array('in',$ids)))->count();
   if($record <= 0){
       echo("可以删除");
   }else{
       echo("不能删除");
   }

例3.多条删除:参数是一个数组,存放id

//数组$ids是存放待删除的记录的所有id
 $ids=array(1,2,3);
 $stockInModel= M('StockIn'); 
 $stockInModel->startTrans();//开启事务
 $delMainRes = $stockInModel->where(array('id'=>array('in',$ids)))->delete(); //再删除主表记录

if( !$delMainRes){//出错或删除失败事务回滚
    $model->rollback();
    return false;
}
$model->commit();//提交事务

4、数据更新

具体参考:http://document.thinkphp.cn/manual_3_2.html#update_data

4.1更新数据

更新数据使用save方法
save()返回值:save方法的返回值是影响的记录数,如果返回false则表示更新出错,因此一定要用恒等来判断是否更新失败

<?php
$User = M("User"); // 实例化User对象
$data['name'] = 'ThinkPHP';// 要修改的数据对象属性赋值
$data['email'] = 'ThinkPHP@gmail.com';
$mainRes = $User->where('id=5')->save($data); // 根据条件更新记录
if($mainRes === false){     //判断是否更新成功
     return '更新入库单记录失败!';
}
?>

更新数据的条件:如果没有任何更新条件(where),数据对象本身也不包含主键字段的话

4.2更新字段

5、 数据读取(查)

数据查询方法支持的连贯操作方法
具体参考http://document.thinkphp.cn/manual_3_2.html#read_data

5.1读取数据

find()方法
读取数据表中的一行数据(或者关联数据),主要通过find方法完成
find()的返回值
如果查询出错,find方法返回false,如果查询结果为空返回NULL,查询成功则返回一个关联数组(即使满足条件的数据不止一个 find方法也只会返回第一条记录

$User = M("User"); // 实例化User对象
$data = $User->where('status=1 AND name="thinkphp"')->find();// 查找status值为1name值为think的用户数据 
dump($data);

5.2读取数据集

select()方法
读取数据集其实就是获取数据表中的多行记录(以及关联数据),使用select方法
select()方法的返回值
如果查询出错,select的返回值是false,如果查询结果为空,则返回NULL,否则返回二维数组

$User = M("User"); // 实例化User对象
// 查找status值为1的用户数据 以创建时间排序 返回10条数据
$list = $User->where('status=1')->order('create_time')->limit(10)->select();

5.3读取字段值

getField()方法
读取字段值其实就是获取数据表中的某个列的多个或者单个数据,最常用的方法是 getField方法

默认情况下,当只有一个字段的时候,返回满足条件的数据表中的该字段的第一行的值

$User = M("User"); // 实例化User对象
// 获取ID为3的用户的昵称 
$nickname = $User->where('id=3')->getField('nickname');

如果需要返回整个列的数据

$User->getField('id',true); // 获取id数组
//返回数据格式如array(1,2,3,4,5)一维数组,其中value就是id列的每行的值

如果传入多个字段的话,默认返回一个关联数组

$User = M("User"); // 实例化User对象
// 获取所有用户的ID和昵称列表 
$list = $User->getField('id,nickname');
//两个字段的情况下返回的是array(`id`=>`nickname`)的关联数组,以id的值为key,nickname字段值为value

getField方法还可以支持限制数量

$this->getField('id,name',5); // 限制返回5条记录
$this->getField('id',3); // 获取id数组 限制3条记录

输出sql 调试用

$User = M("User"); // 实例化User对象
// 获取ID为3的用户的昵称 
$nickname = $User->where('id=3')->getField('nickname');
echo($User ->getLastSql());  
posted on 2017-04-11 16:14  dreamstar  阅读(102)  评论(0编辑  收藏  举报