thinkPHP对数据库的CURD操作总共有三种:原生、查询构造器、模型
1、原生
查询 query(select)
更新和写入 execute(update/insert) 如果数据非法或者查询错误则返回false,否则返回影响的记录数。
$res = Db::query('select * from staff');
$sql = "update staff set `email`='tmz@php.cn' WHERE `id` = 11";
$res = Db::execute($sql);
dump($res);2、查询构造器
首先需要在thinkPHP的 config/database.php 配置文件中配置下数据库的连接数据。
然后通过查询构造器进行操作:
2.1 查询
Db::table('staff')
->where('id',1)
->find() | ->select() | ->value('name') | ->column('name','id')find 方法只能查询满足条件的第一条数据,查询结果不存在,返回 null,否则返回结果数组
select 方法查询满足条件所有数据,结果是一个二维数组,如果结果不存在,返回空数组
value 查询某个字段的值 方法查询结果不存在,返回 null
column 查询某一列的值 方法查询结果不存在,返回空数组
2.2 新增
* 添加单条记录
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('staff')
->insert($data) | ->data($data)->insert() | ->strict(false)->insert($data) | ->insert($data, true)
->insertGetId($data)insert 方法添加数据成功返回添加成功的条数,通常情况返回 1
data 方法传入要添加的数据 数据表里面没有foo或者bar字段,那么就会抛出异常
strict 不存在的字段的值将会直接抛弃
insertGetId 方法添加数据成功返回添加数据的自增主键
* 添加多条数据
$data = [
['foo' => 'bar', 'bar' => 'foo'],
['foo' => 'bar1', 'bar' => 'foo1'],
['foo' => 'bar2', 'bar' => 'foo2']];
Db::table('staff')
->insertAll($data) | ->data($data)->insertAll()insertAll 方法添加数据成功返回添加成功的条数
data 方法传入要添加的数据
* 确保要批量添加的数据字段是一致的
2.3 更新
Db::table('staff')
->where('id', 1) // 数据
->update(['name' => 'thinkphp']) | ->data(['name' => 'thinkphp'])->update()update 方法返回影响数据的条数,没修改任何数据返回 0
data 方法传入要更新的数据
* 如果update方法和data方法同时传入更新数据,则会进行合并。
* 如果数据中包含主键,可以直接使用:
Db::table('staff')
->update(['name' => 'thinkphp','id'=>1]);
实际生成的代码:UPDATE `think_user` SET `name`='thinkphp' WHERE `id` = 1* 更新字段值
Db::table('staff')
->where('id',1)
->setField('name', 'thinkphp')setField 方法返回影响数据的条数,没修改任何数据字段返回 0
* 自增或自减一个字段的值
Db::table('staff')
->where('id', 1)
->setInc('score') | ->setInc('score', 5)setInc/setDec 方法自增或自减一个字段的值( 如不加第二个参数,默认步长为1)
setInc/setDec 支持延时更新,如果需要延时更新则传入第三个参数,下例中延时10秒更新
Db::table('staff')
->where('id', 1)
->setInc('score', 1, 10)setInc/setDec 方法返回影响数据的条数,如果使用了延迟更新的话,可能会返回true
2.4 删除
Db::table('staff')->delete(1) | ->delete([1,2,3])
Db::table('staff')->where('id',1)->delete()
Db::table('staff')->delete(true)delete 方法返回影响数据的条数,没有删除返回 0
2.5 软删除
一般情况下,业务数据不建议真实删除数据,系统提供了软删除机制(模型中使用软删除更为方便)
// 软删除数据 使用delete_time字段标记删除
Db::table('staff')
->where('id',1)
->useSoftDelete('delete_time',time())
->delete();useSoftDelete 方法表示使用软删除,并且指定软删除字段为delete_time,写入数据为当前的时间戳。
2.6 链式调用
Db::table('staff')
->field()
->where()
->limit()
table('表名') 用于指定操作的数据表
field('字段1,字段2,...') 字符串 标识要返回或者操作的字段,可以用于查询和写入操作
field(['字段1','字段2','字段N',...]) 数组
field(['字段1','字段2'=>'别名']) 数组方式可以为某些字段定义别名
field(true) 显示获取数据表的所有字段列表
where('字段名','表达式','查询条件') 表达式查询
where(['name' =>'thinkphp','status'=> 1]) 数组条件查询:关联数组和索引数组
where('type=1 AND status=1') 字符串条件查询
limit(number) 限制结果数量
limit(起始数据,显示条数) 分页查询
order('id', 'desc') 对操作的结果排序或者优先级限制 ORDER BY `id` desc
order(['order','id'=>'desc']) 对多个字段的排序 ORDER BY `order`,`id` desc
* 如果没有指定desc或者asc排序规则的话,默认为asc
strict(false) 设置是否严格检查字段名
alias('别名') 设置当前数据表的别名3、模型查询
模型查询和数据库查询方法的区别主要在于,模型中的查询的数据在获取的时候会经过获取器的处理,以及更加对象化的获取方式。
模型查询一般一个模型是对应着一张表,创建模型并且继承系统的Model模型类库。
模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写
模型常用的设置属性:

namespace app\index\model;
use think\Model;
class User extends Model{
// 设置当前模型对应的完整数据表名称
protected $table = 'staff';
// 设置当前模型的数据库连接
protected $connection = 'db_config';
// 默认主键为id,如果你没有使用id作为主键名,需要在模型中设置属性
protected $pk = 'uid';
}3.1 查询
// 主键查询
$res = User::get(1);
// 查询构造器
$res = User::field('id,name,email')
->where('id',5)
->find();
// 闭包 必传参数 Query $query
$res = User::get(function (Query $query){
$query->where('id',7);
});* 根据主键查询单条数据
$user = User::get(1); echo $user->name;
$user = User::where('name', 'thinkphp')->find(); echo $user->name;get(主键值) 查询满足当前主键的数据
模型无论使用get还是find方法查询,返回的是都当前模型的对象实例,如果查询数据不存在,则返回Null,除了获取模型数据外,还可以使用模型的方法。
* 根据主键获取多个数据
$list = User::all('1,2,3') | all([1,2,3])
foreach($list as $key=>$user){
echo $user->name;
}all() 没参数则是获取所有数据
all('1,2,3')或all([1,2,3]) 获取主键值为 1,2,3 的数据
*****
User:: 相当于 Db::table(),所以可以使用User::代替Db::table()进行操作--使用查询构造器查询,但是第一个方法一定是静态调用
User::where('status', 1)->limit(3)->order('id', 'asc')->all()
3.2 新增
* 新增单条数据
实例化模型对象后赋值并保存 $user= new User; $user->name = 'thinkphp'; $user->email = 'thinkphp@qq.com'; $user->save(); 或 直接传入数据到save方法批量赋值 $user->save([ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com']) 或 直接在实例化的时候传入数据 $user = new User([ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com']); $user->save();
获取自增ID echo $user->id;
save 方法返回影响的记录数,并且只有当before_insert事件返回false的时候返回false,从V5.1.6+版本开始统一返回布尔值
* 添加多条数据
$list = [ ['name'=>'thinkphp','email'=>'thinkphp@qq.com'], ['name'=>'onethink','email'=>'onethink@qq.com']]; $user->saveAll($list);
saveAll 方法新增数据返回的是包含新增模型(带自增ID)的数据集对象。默认会自动识别数据是需要新增还是更新操作,当数据中存在主键的时候会认为是更新操作,如果你需要带主键数据批量新增,可以使用下面的方式:
$list = [ ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'], ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com'],]; $user->saveAll($list, false);
** 静态方法
$user = User::create([ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com']); echo $user->name; echo $user->email; echo $user->id; // 获取自增ID
和save方法不同的是,create方法返回的是当前模型的对象实例
3.3 查找和更新
在取出数据后,更改字段内容后使用save方法更新数据。这种方式是最佳的更新方式。 $user = User::get(1); $user->name = 'thinkphp'; $user->email = 'thinkphp@qq.com'; $user->save();
* 查询构造器
$user = User::where('status',1)
->where('name','liuchen')
->find();* 批量更新数据
** saveAll 方法批量更新数据,只需要在批量更新的数据中包含主键即可
$list = [ ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'], ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com']]; $user->saveAll($list); 批量更新方法返回的是一个数据集对象。批量更新仅能根据主键值进行更新,其它情况请自行处理。
** 静态方法
User::where('id', 1)
->update(['name' => 'thinkphp']);
或
User::update(['id' => 1, 'name' => 'thinkphp']);3.4 删除
* 删除模型数据
$user = User::get(1); $user->delete(); delete方法返回影响的记录数
* 静态方法(根据主键删除)
User::destroy(1);
User::destroy('1,2,3') | destroy([1,2,3]);destroy 方法传入空值(包括空字符串和空数组)的时候不会做任何的数据删除操作,但传入0则是有效的
* 闭包删除
User::destroy(function($query){
$query->where('id','>',10);
});* 如果删除当前模型数据,用delete方法,如果需要直接删除数据,使用destroy静态方法
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号