ThinkPHP 5 操作数据库三种方法
一、原生的sql语句
1. query:查询操作
query简单粗暴的方法
public function getDetail($id){
$data= Db::query('select * from test');
return $data;
}
可以传参数;用占位符或者命名占位符绑定
public function getDetail($id){
$data= Db::query('select * from test where id=?',[$id]);
return $data;
}
2. execute:写入操作
execute 插入数据,返回值是影响的记录数
$data= Db::execute('insert into test (name) values (?)',['thinkphp']);
return $data;
二、使用查询构建器
备注:TP5框架有助手函数
Db::table(‘user’) 相当于 db(‘user’)
1.find、select
find()只能返回第一条数据(建议单个查询使用);select()是把所有符合的查询出来
细节:
find 方法查询结果不存在,返回 null
select 方法查询结果不存在,返回空数组
//链式表达式
//链式操作where('字段名','表达式','查询条件')
//这里的等号可以缺审
$data=Db::table('test')->where('id',1)->find();
$data=Db::table('test')->select();
//助手函数
$data =db('test')->where('id',1)->find();
$data =db('test')->select();
2.insert
update 方法返回影响数据的条数,没修改任何数据返回 0
//插入单条数据
$aa = ['name' => 'good'];
$data=Db::table('test')->insert($aa);
//插入多条数据
$bb = [
['name' => 'bb'],
['name' => 'cc'],
['name' => 'dd'],
];
$data = Db::table('test')->insertAll($bb);
//函数助手
// 添加单条数据
db('user')->insert($aa);
// 添加多条数据
db('user')->insertAll($bb);
3.update
//更新某一条记录
$data = Db::table('test')->where('id',1)->update(['name'=>'老张']);
//更新某条记录的某个字段的值:
$data=Db::table('test')->where('id',2)->setField('name', '老四');
4.delete
delete 方法返回影响数据的条数,没有删除返回 0
// 根据主键删除
$data=Db::table('test')->delete(6);
//可以传入数组,进行批量删除
$data=Db::table('test')->delete([7,8]);
5.自增或自减一个字段的值
自增或自减一个字段的值
setInc/setDec 如不加第二个参数,默认值为1;第三个参数是延迟时间,单位秒
// score 字段加 1
Db::table('think_user')->where('id', 1)->setInc('score');
// score 字段加 5
Db::table('think_user')->where('id', 1)->setInc('score', 5);
// score 字段减 1
Db::table('think_user')->where('id', 1)->setDec('score');
//延迟更新,第三个参数是时间单位秒
Db::table('think_user')->where('id', 1)->setInc('score', 1, 10);
6.使用Query或闭包查询
使用查询对象进行查询
$query = new \think\db\Query();
$query->table('think_user')->where('status',1);
Db::find($query);
Db::select($query);
//使用闭包函数查询
Db::select(function($query){
$query->table('think_user')->where('status',1);
});
7.查询表达式
where(‘字段名’,‘表达式’,‘查询条件’);
whereOr(‘字段名’,‘表达式’,‘查询条件’);
表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:
表达式 | 含义 |
---|---|
EQ、= | 等于(=) |
NEQ、<> | 不等于(<>) |
GT、> | 大于(>) |
EGT、>= | 大于等于(>=) |
LT、< | 小于(<) |
ELT、<= | 小于等于(<=) |
LIKE | 模糊查询 |
[NOT] BETWEEN | (不在)区间查询 |
[NOT] IN | (不在)IN 查询 |
[NOT] NULL | 查询字段是否(不)是NULL |
[NOT] EXISTS | EXISTS查询 |
EXP | 表达式查询,支持SQL语法 |
> time | 时间比较 |
< time | 时间比较 |
between time | 时间比较 |
notbetween time | 时间比较 |
8.链式操作 操作名称
所有的连贯操作都返回当前的模型实例对象(this),其中带*标识的表示支持多次调用。
连贯操作 | 作用 | 支持的参数类型 |
---|---|---|
where* | 用于AND查询 | 字符串、数组和对象 |
whereOr* | 用于OR查询 | 字符串、数组和对象 |
wheretime* | 用于时间日期的快捷查询 | 字符串 |
table | 用于定义要操作的数据表名称 | 字符串和数组 |
alias | 用于给当前数据表定义别名 | 字符串 |
field* | 用于定义要查询的字段(支持字段排除) | 字符串和数组 |
order* | 用于对结果排序 | 字符串和数组 |
limit | 用于限制查询结果数量 | 字符串和数字 |
page | 用于查询分页(内部会转换成limit) | 字符串和数字 |
group | 用于对查询的group支持 | 字符串 |
having | 用于对查询的having支持 | 字符串 |
join* | 用于对查询的join支持 | 字符串和数组 |
union* | 用于对查询的union支持 | 字符串、数组和对象 |
view* | 用于视图查询 | 字符串、数组 |
distinct | 用于查询的distinct支持 | 布尔值 |
lock | 用于数据库的锁机制 | 布尔值 |
cache | 用于查询缓存 | 支持多个参数 |
relation* | 用于关联查询 | 字符串 |
with* | 用于关联预载入 | 字符串、数组 |
bind* | 用于数据绑定操作 | 数组或多个参数 |
comment | 用于SQL注释 | 字符串 |
force | 用于数据集的强制索引 | 字符串 |
master | 用于设置主服务器读取数据 | 布尔值 |
strict | 用于设置是否严格检测字段名是否存在 | 布尔值 |
sequence | 用于设置Pgsql的自增序列名 | 字符串 |
failException | 用于设置没有查询到数据是否抛出异常 | 布尔值 |
partition | 用于设置分表信息 | 数组 字符串 |
三、模型ORM
1.定义
默认主键为自动识别,如果需要指定,
可以设置属性:protected $pk = 'uid';
2.引用+获取数据 (get 、all)
获取单个数据
//引用
use app\index\model\Test as TestModel;
...
//获取主键为1的数据
$data = TestModel::get(1);
//数组的方法
$data = TestModel::get(['id'=>1]);
//闭包的方法
$data = TestModel::get(function($query){
$query->where('id', 1);
});
...
获取多个数据
//引用
use app\index\model\Test as TestModel;
...
//获取所有数据
$data =TestModel::all();
// 根据主键获取多个数据
$list = User::all('1,2,3');
// 或者使用数组
$list = User::all([1,2,3]);
foreach($list as $key=>$user){
echo $user->name;
}
// 使用数组查询
$list = User::all(['status'=>1]);
// 使用闭包查询
$list = User::all(function($query){
$query->where('status', 1)->limit(3)->order('id', 'asc');
});
foreach($list as $key=>$user){
echo $user->name;
}
实例化的方法
$user = new Test();
// 查询单个数据
$data=$user->where('id', 1)
->find();
return $data;
}
3.新增(save、saveAll)
新增一条
//新增一条
$test = new Test;
$test->name = 'thinkphp';
$test->save();
//data数组批量赋值
$test = new Test;
$test->data([
'name' => 'thinkphp',
]);
$test->save();
//直接在实例化的时候传入数据
$test = new Test([
'name' => 'thinkphp',
]);
$test->save();
批量新增
$test = new Test;
$list = [
['name'=>'thinkphp'],
['name'=>'onethink']
];
$test->saveAll($list);
4.更新(save、saveAll、update)
查询与更新
//在取出数据后,更改字段内容后更新数据。
$test = new Test;
$test= Test::get(1);
$test->name = 'thinkphp';
$test->save();
.....
//也可以直接带更新条件来更新数据
$test = new Test;
// save方法第二个参数为更新条件
$test->save([
'name' => 'thinkphp',
],['id' => 1]);
批量更新
批量更新仅能根据主键值进行更新,其它情况请使用foreach遍历更新。
$test = new Test;
$list = [
['id'=>1, 'name'=>'thinkphp'],
['id'=>2, 'name'=>'onethink']
];
$test->saveAll($list);
静态方法更新
$data=Test::where('id', 1)
->update(['name' => 'thinkphp']);
//$data是受影响行数
//或者使用:
$data=Test::update(['id' => 1, 'name' => 'thinkphp']);
//$data返回结果集
5.删除(delete、destroy)
//delete方法
$data = Test::get(5);
$data->delete();
//根据主键删除
//或者直接调用静态方法
User::destroy(1);
// 支持批量删除多个数据
User::destroy('1,2,3');
// 或者
User::destroy([1,2,3]);
//条件删除
// 删除状态为0的数据
User::destroy(['status' => 0]);
//或者通过数据库类的查询条件删除
User::where('id','>',10)->delete();
V5.0.9+版本开始当destroy方法传入空值(包括空字符串和空数组)的时候不会做任何的数据删除操作,但传入0则是有效的
想要了解更多的相关操作可以点击下方链接:
https://www.kancloud.cn/manual/thinkphp5/118058