Laravel 数据库实例教程 —— 使用查询构建器实现对数据库的高级查询
2017-06-01 16:09
639 查看
上一节我们简单介绍了如何使用查询构建器对数据库进行基本的增删改查操作,这一节我们来探讨如何使用查询构建器实现一些更高级的查询操作。
连接查询指的是将两张表或多张表关联到一起进行查询,获取一个表的行与另一个表的行匹配的数据。常见的连接查询包括内连接(等值连接)、左(外)连接、右(外)连接和交叉连接(完全连接)等。下面这张图形象的展示了这几种连接查询所获取的结果集:
下面我们简单演示下内连接和左连接。我们将用户表
其中
内连接用于获取两张表结果集的交集部分,我们可以使用查询构建器的
显示结果如下:
左连接的结果集指定的左表的所有行,如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。我们使用查询构建器的
对应的输出结果为:
很多时候,连接查询的查询条件往往更为复杂,并不是一个简单的
输出结果为:
联合查询用于将两个或更多查询的结果集组合为单个结果集,该结果集包含联合查询中所有查询的全部行。UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同,另一个Select语句的结果集列名将被忽略,且其他查询字段数必须和第一个相同。Laravel查询构建器中我们使用
输出结果为:
使用查询构建器上的
如果操作符为“=”,该语句也可简化为:
输出结果为:
需要注意的是查询构建器支持方法链,这意味着如果有多个查询条件且这个多个条件是AND连接,可以在
对应输出为:
更多where子句查询条件可查看
查询构建器使用
根据代码可以看到
为了更好地演示分组,我们给数据表
分组一般用于聚合查询,接下来我们使用
输出如下:
我们还可以使用
输出结果为:
注意:
查询构建器中使用
对应的输出结果为:
1、连接查询(join)
连接查询指的是将两张表或多张表关联到一起进行查询,获取一个表的行与另一个表的行匹配的数据。常见的连接查询包括内连接(等值连接)、左(外)连接、右(外)连接和交叉连接(完全连接)等。下面这张图形象的展示了这几种连接查询所获取的结果集:下面我们简单演示下内连接和左连接。我们将用户表
users和文章表
posts关联到一起进行查询,在此之前,我们先创建
posts表,其字段及初始值如下:
其中
user_id对应
users表中的用户id。
1.1 内连接
内连接用于获取两张表结果集的交集部分,我们可以使用查询构建器的join方法进行内连接查询:
$users = DB::table('users')->join('posts','users.id','=','posts.user_id')->get(); dd($users);
显示结果如下:
1.2 左连接
左连接的结果集指定的左表的所有行,如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。我们使用查询构建器的leftJoin方法进行左连接查询:
$users = DB::table('users')->leftJoin('posts','users.id','=','posts.user_id')->get(); dd($users);
对应的输出结果为:
1.3 更加复杂的连接查询
很多时候,连接查询的查询条件往往更为复杂,并不是一个简单的join/
leftJoin方法就能搞定的,那么我们如何添加更加复杂的查询条件呢?使用
JoinClause代替条件参数:
$users = DB::table('users')->join('posts',function($join){ $join->on('users.id','=','posts.user_id') ->where('posts.id','>',1); })->get(); dd($users);
输出结果为:
2、联合查询(union)
联合查询用于将两个或更多查询的结果集组合为单个结果集,该结果集包含联合查询中所有查询的全部行。UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同,另一个Select语句的结果集列名将被忽略,且其他查询字段数必须和第一个相同。Laravel查询构建器中我们使用union方法进行联合查询:
$users = DB::table('users')->where('id','<',3); $users = DB::table('users')->where('id','>',2)->union($users)->get(); dd($users);
输出结果为:
3、where子句
使用查询构建器上的where方法可以添加自定义查询条件,调用该方法需要传入三个参数:第一个列名,第二个是操作符,第三个是比较值:
$user = DB::table('users')->where('name','=','Laravel')->get(); dd($user);
如果操作符为“=”,该语句也可简化为:
$user = DB::table('users')->where('name','Laravel')->get();
输出结果为:
需要注意的是查询构建器支持方法链,这意味着如果有多个查询条件且这个多个条件是AND连接,可以在
get之前使用多个
where方法。如果多个条件使用OR连接,可以使用
orWhere方法:
$user = DB::table('users')->where('name','Laravel')->orWhere('name','Academy')->get();
对应输出为:
更多where子句查询条件可查看
Illuminate\Database\Query\Builder源码。
4、排序
查询构建器使用orderBy方法对查询结果进行排序:
$users = DB::table('users')->orderBy('id','desc')->get(); dd($users);
根据代码可以看到
orderBy方法需要传入两个参数,第一个是排序字段,第二个是排序方向,
asc代表升序,
desc代表倒序,上述代码输出为:
5、分组
为了更好地演示分组,我们给数据表posts新增两个字段:
cat_id和
views,代表分类ID和浏览数:
分组一般用于聚合查询,接下来我们使用
groupBy方法对查询结果进行分组,比如我们可以统计每个分类下有几篇文章:
$posts = DB::table('posts')->select('cat_id',DB::raw('COUNT(id) as num'))->groupBy('cat_id')->get(); dd($posts);
输出如下:
我们还可以使用
having方法为分组加上条件,比如我们可以统计总浏览数大于500的分类:
$posts = DB::table('posts')->select('cat_id',DB::raw('SUM(views) as views'))->groupBy('cat_id')->having('views','>',500)->get(); dd($posts);
输出结果为:
注意:
having中的条件字段必须出现在
select查询字段中,否则会报错。
6、分页
查询构建器中使用skip和
take对查询结果进行分页,相当于SQL语句中的
limit语句:
$posts = DB::table('posts')->skip(0)->take(2)->get(); dd($posts);
对应的输出结果为:
相关文章推荐
- Laravel 数据库实例教程 —— 使用查询构建器对数据库进行增删改查
- Laravel 数据库实例教程 —— 使用DB门面操作数据库
- 使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例
- PHP中XPATH 实现xml及html文件快速解析(附xml做小型数据库实现六级单词快速查询实例)
- 在 Laravel 5.1 中使用SMTP驱动实现邮件发送(含附件和图片)详细教程
- 使用ADO.NET类及方法实现数据库的查询并返回一个Object 数组
- 利用resteasy框架构建rest webservice----第三波:实现文件上传---非form提交方式(实例、教程)
- php简单实现查询数据库返回json数据(返回json数据函数实例)
- 查询数据库的数据,是个比较费时的工作,在使用线程查询的时候显示个进度条,并允许终止查询的实现
- SqlServer 连接字串不使用数据库名 实现跨库查询
- PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
- Laravel框架学习(数据库高级查询)
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【二】——使用Repository模式构建数据库访问层
- laravel5.4之查询构建器where使用总结一
- 使用ASP.NET WEB API构建基于REST风格的服务实战系列教程(一)——使用EF6构建数据库及模型
- 利用javabean轻松实现对数据库的连接、查询以及增删改!------使用范例
- 使用PhotonServer和Unity建立一个棋牌类游戏实例(二)构建photon服务器与数据库的交互
- 初学JDBC(五)-使用ResultSet结果集对数据库表内容实现查询操作
- 在 Laravel 中使用 Laravel Searchy 扩展包实现基于数据库的轻量级搜索功能
- 使用Python的web.py框架实现类似Django的ORM查询的教程