2019年7月

mysql事务中,可能有多条sql执行,其中有一条执行失败,整个事务就会回滚。只要有一条sql的返回结果为false,那么事务就会回滚 也包括sql语句发生了语法错误

 Db::startTrans();
        try{
            $re1 = Db::name('t1')->insert(array("name"=>"szy"));
            $re2 = Db::name('t2')->insert(array("name"=>6));         
            Db::commit();
            $this->success("成功");
        }catch (\Exception $exception){
            //错误信息
            print_r(11111);
            Db::rollback();
            print_r($exception->getMessage());
        }

验证模块
在应用控制台验证目录下创建cate验证器:application/admin/validata/Cate.php

<?php
namespace app\admin\validate;
 
use think\Validate;
 
class Cate extends Validate
{
    //验证规则
    protected $rule = [
        // catename验证,必须,长度不能超过25,名称不能重复
        'catename'  =>  'require|max:25|unique:cate',
        'keywords' => 'require',
    ];
 
    //验证提示
    protected $message  =   [
        'catename.unique' => '栏目名称不能重复', 
        'catename.max' => '栏目名称不能大于5个字符',
        'catename.require' => '栏目名称必须',
        'keywords.require' => '栏目关键词必须',
    ];
    //添加代码验证场景
    protected $scene = [
        'edit'  =>  ['catename'],
    ];
}

在$scene规则中定义好需要验证的字段为catename,只在edit条件下验证
调用模块验证
cate的控制器文件aplication/admin/controller/Cate.php的edit操作方法中添加指定处代码

    public function edit()
    {
        //获取修改的信息
        $id=input('id');
        $cates = db('cate')->where('ID',$id)->find();
        $this->assign('cates',$cates);//模板赋值
        //修改后提交
        if(request()->isPost()){
            $data=[
                'ID'=>input('id'),
                'catename'=>input('catename'),
                'keywords'=>input('keywords'),
                'desc'=>input('desc'),
                'type'=>input('type') ? input('type') : 0,
            ];
            //验证
            $validate = \think\Loader::validate('Cate');
        //添加代码->scene('edit')
            if($validate->scene('edit')->check($data)){
                $res = \think\Db::name('cate')->update($data);
                if($res){
                    return $this->success('修改栏目成功','lists');
                }else{
                    return $this->error('修改栏目失败');
                }
            }else{
                //验证失败输出提示信息
                return $this->error($validate->getError());
            }
        }
        return $this->fetch();
    }

验证data之前,进行场景过滤,只验证验证器中定义的场景
自定义场景验证

数据库操作之原生sql操作

<?php
namespace app\index\controller;
use think\Db;

class Index
{
    public function index()
    {
        echo "hello world";
    }

    public function sqlAdd(){
        //插入数据
        $result=Db::execute('insert into think_test (name,state) values("周杰伦",1)');
        var_dump($result);//返回受影响的行数
    }

    public function sqlUpd(){
        //修改数据
        $result=Db::execute('update think_test set name="张学友",state=0 where id=1');
        var_dump($result);//返回受影响的行数
    }

    public function sqlDel(){
        //删除数据
        $result=Db::execute('delete from think_test where id=1');
        var_dump($result);//返回受影响的行数
    }

    public function sqlSel(){
        //查询数据
        $result=Db::query('select * from think_test');
        var_dump($result);//返回数组
    }
}

②数据库操作之查询构造器

//==========================查询构造器==========================
    public function tabAdd(){
        //插入数据 如果不写表前缀 把table改为name即可
        $result=Db::table('think_test')->insert(['name'=>'段誉','state'=>1]);
        var_dump($result);
    }

    public function tabUpd(){
        //修改数据 如果不写表前缀 把table改为name即可
        $result=Db::table('think_test')->where('id',9)->update(['name'=>'虚竹']);
        var_dump($result);
    }

    public function tabDel(){
        //删除数据 如果不写表前缀 把table改为name即可
        $result=Db::table('think_test')->where('id',9)->delete();
        var_dump($result);
    }

    public function tabSel(){
        //查询数据 如果不写表前缀 把table改为name即可
        $result=Db::table('think_test')->select();
        var_dump($result);
    }

    //使用助手函数db
    public function dbSel(){
        $db=db('test');//参数为表名
        $result=$db->select();
        var_dump($result);
        //其他操作类似
        //ps:助手函数db默认每次都会重新连接数据库,所以不推荐使用
    }

    //链式操作
    public function linkSel(){
        $list=Db::name('test')
            ->where('state',1)
            ->field(['name','state'])
            ->order('id','desc')
            ->limit(10)
            ->select();
        var_dump($list);
        //ps:链式操作select() 要在最后 其他条件顺序无所谓
        //更多方法请查询手册
    }

③数据库操作之模型(model)

<?php
namespace app\index\controller;
use app\index\model\User as UserModel;

class User
{
    //==========================模型==========================
    /*模型是一种对象关系映射简称ORM,一般来说每个数据表会和一个模型对应
    ,模型不是简单的CURD操作,那种用Db类即可,模型的Db类的区别在于,模型
    查询返回的是对象,Db查询返回的是数组,模型是比Db类更高级的数据封装
    */

    //插入数据属性
    public function add1(){
        $user = new UserModel();
        $user->name = '郭靖';
        $user->email = 'guojing@qq.com';
        $user->birthday = strtotime('2000-1-1');
        if($user->save()){
            return '插入成功';
        }else{
            return '插入失败';
        }
    }

    //插入数据数组
    public function add2(){
        $user['name'] = '黄蓉';
        $user['email'] = 'huangrong@qq.com';
        $user['birthday'] = strtotime('2003-1-1');
        if(UserModel::create($user)){
            return '插入成功';
        }else{
            return '插入失败';
        }
    }

    //插入数据多条
    public function addList(){
        $user = new UserModel();
        $list = [
            ['name'=>'张三','email'=>'zhangsan@qq.com','birthday'=>strtotime('2000-1-1')],
            ['name'=>'李四','email'=>'lishi@qq.com','birthday'=>strtotime('2005-1-1')]
        ];
        if($user->saveAll($list)){
            return '插入成功';
        }else{
            return '插入失败';
        }
    }

    //更新数据 查找并更新
    public function upd1(){
        $user = UserModel::get(1);//参数为id
        // var_dump($user);
        $user->name = '刘德华';
        $user->email = 'liudehua@qq.com';
        if($user->save()){
            return '更新成功';
        }else{
            return '更新失败';
        }
    }

    //更新数据 直接更新
    public function upd2(){
        $user = new UserModel();
        $user -> save(['name'=>'郭富城','email'=>'guofucheng@qq.com'],['id'=>1]);
    }

    //更新数据 多条
    public function upd3(){
        $user = new UserModel();
        $list=[
            ['id'=>1,'name'=>'张三丰','email'=>'zsf@qq.com'],
            ['id'=>2,'name'=>'欧阳锋','email'=>'oyf@qq.com']
        ];
        if($user->saveAll($list)){
            return '更新成功';
        }else{
            return '更新失败';
        }
    }

    //查询数据 id
    public function select1(){
        $user = UserModel::get(1);
        echo $user->name.'<br/>';
        echo $user->email.'<br/>';
        echo $user->birthday.'<br/>';
    }

    //查询数据 数组
    public function select2(){
        $user = UserModel::get(['name'=>'张三']);
        echo $user->name.'<br/>';
        echo $user->email.'<br/>';
        echo $user->birthday.'<br/>';
    }

    //查询数据
    public function select3(){
        $user = new UserModel();
        $result = $user->where('name','张三')->find();
        echo $result->birthday;
    }

    //查询数据 多个数据
    public function selectAll(){
        $list = UserModel::all([1,2,3]);
        foreach ($list as $key => $value) {
            echo $value->name.'<br/>';
            echo $value->email.'<br/>';
            echo $value->birthday.'<br/>';
        }
    }
}