牛骨文教育服务平台(让学习变的简单)
博文笔记

ThinkPHP5学习(9)数据库-事务,链式操作

创建时间:2017-06-07 投稿人: 浏览次数:2559

学习内容及参考:

视频教程:

https://www.kancloud.cn/tpshop/thinkphp5/224105

完全开发手册:https://www.kancloud.cn/manual/thinkphp5/139063

教程中的代码:https://github.com/phpervip/tp5a

使用链式操作可以完成复杂的数据库查询操作

支持链式操作的查询方法:
select,find,insert,update,delete,value,column,chunk,count…

事务支持
对此,最简单的方法就是使用transaction方法,只需把需要执行的事务操作封装到闭包里面即可.

这篇是用markdown写的,代码显示高亮,故把(8)的代码在此重复一下。

<?php

// 数据库

namespace appadmincontroller;
use thinkDb;

class index2
{
    // 查询数据
     public function test1(){
         //  基本使用

         // 插入记录
             Db::execute("insert into tp_user (id,name) values(?,?)",[8,"thinkphp"]);
         // 更新记录
             Db::execute("update tp_user set name="thinkphp" where id=1 ");
         // 查询数据
            Db::query("select * from tp_user where id=?",[8]);
         // 删除数据
            Db::query("delete from tp_user where id=5");
         // 显示数据列表
            Db::query("show tables from tp5");
         // 清空数据表
            Db::execute("TRUNCATE table tp_user");


         //  命名占位符
          Db::query("select * from tp_user where id=:id",[1]);
          Db::execute("insert into tp_user (id,name) values(:id,:name)",[8,"thinkphp"]);

         // 查询构造器
         // 查询一个数据
         Db::table("tp_user")->where("id",1)->find();
         // 找不到返回null
         // 查询数据集
         Db::table("tp_user")->where("status",1)->select();
         // 找不到返回空数组

         // 设置了表前缀时
         Db::name("user")->where("id",1)->find();
         Db::name("user")->where("status",1)->select();


         // find,select 方法之前可以使用所有的链式操作方法
         // db助手函数
         db("user")->where("id",1)->find();

         // 使用db助手函数默认每次重新连接数据库,而使用Db::name,或Db::table都是单例的
         // 如需要采用相同的链接,可以传入第三个参数。第二个参数为数据库的连接参数
         db("user",[],false)->where("id",1)->find();



         // 使用query对象或闭包查询
         $query = new 	hinkdbQuery();
         $query->table("tp_user")->where("status",1);
         Db::find($query);
        // Db::select($query);

         Db::select(function($query){
             $query->table("tp_user")->where("status",1);
         });

         // 返回某个字段值,
         Db::table("tp_user")->where("id",1)->value("name");

         // 查询某一列的值
         Db::table("tp_user")->where("status",1)->column("name");
         // 指定索引
         Db::table("tp_user")->where("status",1)->column("name","id");

         // 数据集批量处理

         Db::table("tp_user")->chunk(100,function($users){
             foreach($users as $user){
                 //
                 echo "1";
             }
         });

         // 或者交给回调方法myUserIterator处理
         Db::table("tp_user")->chunk(100,"myUserIterator");

         // 你可以通过从闭包函数中返回false来中止对数据集的处理
         Db::table("tp_user")->chunk(100,function($users){
             // 处理结果集
             return false;

         });

         // 也支持在 chunk 方法之前调用其它的查询方法
         Db::table("tp_user")->where("score",">",80)->chunk(100,function($users){
             foreach($users as $user){
                 //
             }
         });

         // JSON类型数据查询
         // 查询JSON类型字段,info字段为json类型
         Db::table("tp_user")->where("info$.email","thinkphp@qq.com")->find();




     }

    // 添加数据
     public function test2(){

         // 5版本,添加 data/inc/dec/exp方法设置数据
         $data = ["foo"=>"bar","bar"=>"foo"];
         Db::table("tp_user")->insert($data);

         Db::name("user")->insert($data);

         // insert 方法添加数据成功返回添加的条数,正常情况返回1
         Db::name("user")->insert($data);
         $userId = Db::name("user")->getLastInsID();
         // 或者直接使用inserGetId方法新增数据并返回主键值
         Db::name("user")->insertGetId($data);


         // 添加多条数据
         $data = [
             ["foo"=>"bar","bar"=>"foo"],
             ["foo"=>"bar1","bar"=>"foo1"],
             ["foo"=>"bar2","bar"=>"foo2"],
         ];
         Db::name("user")->insertAll($data);

         // 助手函数
         db("user")->insert($data);
         db("user")->insertAll($data);

         // 快捷更新
         Db::table("user")
             ->data(["name"=>"tp","score"=>90])
             ->insert();

     }


     //  更新数据
     public function test3(){
         Db::table("tp_user")
             ->where("id",1)
             ->update(["name"=>"thinkphp"]);
         // 数据中包含主键,直接使用
         Db::table("tp_user")
             ->update(["name"=>"thinkphp","id"=>1]);
         // update方法返回影响数据的条数,没修改任何数据返回0

         // 使用Sql函数
         Db::table("tp_user")
             ->where("id",1)
             ->update([
                     "login_time"=>["exp","now()"],
                     "login_times"=>["exp","login_times+1"]
                 ]
             );

         // 更新某个字段的值
         Db::table("tp_user")
             ->where("id",1)
             ->setField("name","thinkphp");

         // 自增自减
         // setInc/setDec
         Db::table("tp_user")
             ->where("id",1)
             ->setInc("score");

         Db::table("tp_user")
            ->where("id",1)
             ->setInc("score",5);

         Db::table("tp_user")
             ->where("id",1)
             ->setDec("score");

         Db::table("tp_user")
             ->where("id",1)
             ->setDec("score",5);

         // 延迟更新
         Db::table("tp_user")->where("id",1)->setInc("score",1,10);

         // 助手函数
         db("user")->where("id",1)->update(["name"=>"thinkphp"]);

         db("user")->where("id",1)->setField("name","thinkphp");

         db("user")->where("id",1)->setInc("score");

         db("user")->where("id",1)->setDec("score");

         // 快捷更新
         Db::table("tp_user")
             ->where("id",1)
             ->inc("read")
             ->dec("score",3)
             ->exp("name","UPPER(name)")
             ->update();

     }
     //  更新数据
     public function test3(){
         Db::table("tp_user")
             ->where("id",1)
             ->update(["name"=>"thinkphp"]);
         // 数据中包含主键,直接使用
         Db::table("tp_user")
             ->update(["name"=>"thinkphp","id"=>1]);
         // update方法返回影响数据的条数,没修改任何数据返回0

         // 使用Sql函数
         Db::table("tp_user")
             ->where("id",1)
             ->update([
                     "login_time"=>["exp","now()"],
                     "login_times"=>["exp","login_times+1"]
                 ]
             );

         // 更新某个字段的值
         Db::table("tp_user")
             ->where("id",1)
             ->setField("name","thinkphp");

         // 自增自减
         // setInc/setDec
         Db::table("tp_user")
             ->where("id",1)
             ->setInc("score");

         Db::table("tp_user")
            ->where("id",1)
             ->setInc("score",5);

         Db::table("tp_user")
             ->where("id",1)
             ->setDec("score");

         Db::table("tp_user")
             ->where("id",1)
             ->setDec("score",5);

         // 延迟更新
         Db::table("tp_user")->where("id",1)->setInc("score",1,10);

         // 助手函数
         db("user")->where("id",1)->update(["name"=>"thinkphp"]);

         db("user")->where("id",1)->setField("name","thinkphp");

         db("user")->where("id",1)->setInc("score");

         db("user")->where("id",1)->setDec("score");

         // 快捷更新
         Db::table("tp_user")
             ->where("id",1)
             ->inc("read")
             ->dec("score",3)
             ->exp("name","UPPER(name)")
             ->update();

     }

     //
     public function test4(){
         // 查询十个满足条件的数据 并按照id倒序排列
         $list = Db::name("data")
             ->where("id",1)
             ->field("id,name")
             ->order("id","desc")
             ->limit(10)
             ->select();
         dump($list);

         // 封装到闭包里面
         Db::transaction(function(){
             Db::table("tp_user")
                 ->delete(1);
             Db::table("tp_user")
                 ->insert(["id"=>28,"name"=>"thinkphp","status"=>1]);
         });

         // 手动控制事务的提交
         Db::startTrans();
         try{
             Db::table("tp_data")
                 ->delete(2);
             Db::table("tp_data")
                 ->insert(["id"=>8,"name"=>"thinkphp","status"=>1]);
             // 提交事务
             echo "try";
             Db::commit();
         }catch(Exception $e){
             // 回滚事务
             echo "catch";
             Db::rollback();
         }
     }


}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。