Thinkphp5手册学习笔记--数据库操作

Thinkphp5的数据库操作内容实在是太多太多,一些功能只有开发大型的项目的时候才能用到。老蔡记录的都是一些平时能用的到的语句。

1:在数据库配置文件database.php中,有一个是否严格检查字段是否存在的配置项经常用到,因为我们为了达到某些目的,可能经常在表单中设置隐藏域。'fields_strict'  => true,设置为true时数据入库时会检查字段是否完全对应。

2:原生语句执行

//查询
Db::query('select * from think_user where id=?',[8]);
//插入
Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']);

//占位符绑定---更安全
Db::query('select * from think_user where id=:id',['id'=>8]);
Db::execute('insert into think_user (id, name) values (:id, :name)',['id'=>8,'name'=>'thinkphp']);

 

3:查询一条数据

Db::name('think_user')->where('id',1)->find();

 find 方法查询结果不存在,返回 null

4:查询多条数据

Db::name('user')->where('status',1)->select();

 select 方法查询结果不存在,返回空数组

5:值和列的查询

// 返回某个字段的值
Db::name('think_user')->where('id',1)->value('name');

// 返回数组
Db::name('think_user')->where('status',1)->column('name');

// 指定索引
Db::name('think_user')->where('status',1)->column('name','id');
Db::name('think_user')->where('status',1)->column('id,name');

 

关于使用Db类静态方法和使用db助手函数哪个更有效率的问题,老蔡经过查阅资料总结如下:

在Thinkphp5.0.9之前的版本

使用db助手函数默认每次都会重新连接数据库--影响效率

在Thinkphp5.0.9之后的版本

db助手函数默认不再强制重新连接

 6:数据分批处理,这里Mark一下,以后研究生成静态文件的时候不知道能不能用的到。

如果你需要处理成千上百条数据库记录,可以考虑使用chunk方法,该方法一次获取结果集的一小块,然后填充每一小块数据到要处理的闭包,该方法在编写处理大量数据库记录的时候非常有用。

比如,我们可以全部用户表数据进行分批处理,每次处理 100 个用户记录:

Db::table('think_user')->chunk(100, function($users) {
    foreach ($users as $user) {
        //
    }
});
// 或者交给回调方法myUserIterator处理
Db::table('think_user')->chunk(100, 'myUserIterator');

 

7:查询JSON格式的字段内容

// 查询JSON类型字段 (info字段为json类型)
Db::table('think_user')->where('info$.email','[email protected]')->find();

 

8:添加数据

 

Db::name('user')->insert($data); //普通新增

Db::name('user')->insert($data);
$userId = Db::name('user')->getLastInsID(); //获取新增的ID,也可以理解为获取这个表中的最大ID

//或者直接用
Db::name('user')->insertGetId($data); //插入数据的同时返回ID。比如用于新增文章的排序值直接设置为这个ID

//添加多条数据---批量添加产品或内容
$data = [
    ['foo' => 'bar', 'bar' => 'foo'],
    ['foo' => 'bar1', 'bar' => 'foo1'],
    ['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data); //返回添加成功的条数

 9:修改/更新数据

Db::name('think_user')->where('id', 1)->update(['name' => 'thinkphp']);

//update 方法返回影响数据的条数,没修改任何数据返回 0


Db::name('think_user')->where('id',1)->setField('name', 'thinkphp');

//只修改name字段的值

// 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');
// score 字段减 5
Db::table('think_user')->where('id', 1)->setDec('score', 5);

//自增或自减字段的值,比如用于文章点击数

请注意,编辑内容时什么都不修改直接提交返回的是0,所以用if判断的时候可以使用!==false才判断是否真正编辑失败

10:删除数据

 

// 根据主键删除
Db::table('think_user')->delete(1);
Db::table('think_user')->delete([1,2,3]); //这个全选批量删除很适用

// 条件删除    
Db::table('think_user')->where('id',1)->delete();
Db::table('think_user')->where('id','<',10)->delete();

 

 11:条件查询

11.1:AND查询两种方法----就是在name和title中间用&连接

Db::table('think_user')
    ->where('name','like','%thinkphp')
    ->where('status',1)
    ->find();

Db::table('think_user')
    ->where('name&title','like','%thinkphp')
    ->find();

//就是在name和title中间用&连接

11.2:OR查询两种方法---就是在name和title中间用|连接

Db::table('think_user')
    ->where('name','like','%thinkphp')
    ->whereOr('title','like','%thinkphp')
    ->find();

Db::table('think_user')
    ->where('name|title','like','%thinkphp')
    ->find();

11.3:数组条件查询--先定义一个数组然后传入到where里面

$map['name'] = 'thinkphp';
$map['status'] = 1;
// 把查询条件传入查询方法
Db::table('think_user')->where($map)->select(); 

// 助手函数
db('user')->where($map)->select();

//可以使用表达式
$map['id']  = ['>',1];

//可以直接写原生--但是不安全
Db::table('think_user')->where('type=1 AND status=1')->select(); 

 

12:查询其它杂项

//只查询指定的字段
Db::table('think_user')->field('id,title,content')->select();
//数组形式
Db::table('think_user')->field(['id','title','content'])->select();
//这里有一个思路,可以把首页和列表页需要调用的字段写在一个配置项中,然后在调用的时候传入这个配置项,这样就不需要每次都限制一次了。

//支持mysql函数
Db::table('think_user')->field('id,SUM(score)')->select();


//查询除content以外的项目
Db::table('think_user')->field('content',true)->select();

 

13:排序

 需要注意的是:如果没有指定desc或者asc排序规则的话,默认为asc。

Db::table('think_user')->where('status=1')->order('id desc')->limit(5)->select();

 

14:结果去重

应用场景:客户在后台手动输入产品的某个参数,然后取出来已经输入的参数并且去重,以方便下次输入的时候快捷选择。

比如17寸,19寸,20寸

Db::table('think_user')->distinct(true)->field('user_login')->select();

 

15:直接产生编译后的SQL语句,在开发过程中调试错误非常有用

 fetchSql用于直接返回SQL而不是执行查询,适用于任何的CURD操作方法。 例如:

$result = Db::table('think_user')->fetchSql(true)->find(1);

输出result结果为: SELECT * FROM think_user where id = 1

16:当提交的表单字段数和数据库表中的字段数量不一致时,要用到strict。也可以在配置项中直接关闭,

 strict方法用于设置是否严格检查字段名,用法如下:

// 关闭字段严格检查
Db::name('user')->strict(false)->insert($data);

 

17:获取总数、平均数、最大、最小数纪录

 在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括:

方法 说明
count 统计数量,参数是要统计的字段名(可选)
max 获取最大值,参数是要统计的字段名(必须)
min 获取最小值,参数是要统计的字段名(必须)
avg 获取平均值,参数是要统计的字段名(必须)
sum 获取总分,参数是要统计的字段名(必须)
Db::table('think_user')->count(); //总数
Db::table('think_user')->count('id');//根据字段查询总数,有些字段值为空的不计算

Db::table('think_user')->max('score');//最大分数

Db::table('think_user')->where('score>0')->min('score'); //获取分类大于0的最小分

Db::table('think_user')->avg('score'); //获取所有分数的平均分

Db::table('think_user')->sum('score'); //统计分类总和

 

18:时间查询,应用于比如生日、注册时间、服务周期等 

第三个参数可以传入任何有效的时间表达式,会自动识别你的时间字段类型,支持的时间类型包括timestamps、datetime、date和int。比如2016-1-1或者时间戳

// 大于某个时间
where('create_time','> time','2016-1-1');

// 小于某个时间
where('create_time','<= time','2016-1-1');

// 时间区间查询
where('create_time','between time',['2015-1-1','2016-1-1']);



//whereTime方法

// 大于某个时间
Db::table('think_user')->whereTime('birthday', '>=', '1970-10-1')->select();

// 小于某个时间
Db::table('think_user')->whereTime('birthday', '<', '2000-10-1')->select();

// 时间区间查询
Db::table('think_user')->whereTime('birthday', 'between', ['1970-10-1', '2000-10-1'])->select();

// 不在某个时间区间
Db::table('think_user')->whereTime('birthday', 'not between', ['1970-10-1', '2000-10-1'])->select();


//时间表达式---这个多用于存档类型的数据了

// 获取今天的博客
Db::table('think_blog') ->whereTime('create_time', 'today')->select();

// 获取昨天的博客
Db::table('think_blog')->whereTime('create_time', 'yesterday')->select();

// 获取本周的博客
Db::table('think_blog')->whereTime('create_time', 'week')->select();   

// 获取上周的博客
Db::table('think_blog')->whereTime('create_time', 'last week')->select();  
  
// 获取本月的博客
Db::table('think_blog')->whereTime('create_time', 'month')->select();  
 
// 获取上月的博客
Db::table('think_blog')->whereTime('create_time', 'last month')->select();  
    
// 获取今年的博客
Db::table('think_blog')->whereTime('create_time', 'year')->select();    

// 获取去年的博客
Db::table('think_blog')->whereTime('create_time', 'last year')->select(); 
    
// 获取今天的博客
Db::table('think_blog')->whereTime('create_time', 'd')->select();

// 获取本周的博客
Db::table('think_blog')->whereTime('create_time', 'w')->select();  
 
// 获取本月的博客
Db::table('think_blog')->whereTime('create_time', 'm')->select(); 
  
// 获取今年的博客
Db::table('think_blog')->whereTime('create_time', 'y') ->select(); 
   

 

你可能感兴趣的:(ThinkPHP学习)