ThinkPHP5学习(9)数据库-事务,链式操作
学习内容及参考:
视频教程:
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();
}
}
}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。