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静态方法