在上一篇教程中,我们通过查询构建器实现了简单的增删改查操作,而日常开发中,往往会涉及到一些更复杂的查询语句,比如连接查询、子查询、排序、分页、聚合查询等等,这一篇教程我们将围绕这些内容展开探讨。
查询小技巧
我们首先来介绍几个 Laravel 自带的语法糖,可以帮助我们快速获取期望的查询结果,提高编码效率。
有时候,我们想要获取的并不是一行或几行记录,而是某个字段的值,你当然你可以查询到一行记录后从结果对象中获取指定字段的值,但是 Laravel 为我们提供了更便捷的语法:
$name = '学院君';
$email = DB::table('users')->where('name', $name)->value('email');
这样,通过 value
方法返回的就是指定字段的值,无需做额外的判断和提取操作。
如果你想要判断某个字段值在数据库中是否存在对应记录,可以通过 exists
方法快速实现:
$exists = DB::table('users')->where('name', $name)->exists();
如果存在,返回 true
,否则返回 false
。该方法还有一个与之相对的方法 doesntExist()
。
你一定有过这样的经历,从数据库获取指定查询结果后,以主键 ID 值为键,以某个字段值为值构建关联数组,以前,你可能不得不遍历查询结果构建数组才能解决这样的问题,在 Laravel 中,我们只需在查询构建器上调用 pluck
方法即可:
$users = DB::table('users')->where('id', ', 10)->pluck('name', 'id');
该查询返回的结果如下:
![4e344dadf5e1fb76ac4f714b9e7296ed.png](https://img-blog.csdnimg.cn/img_convert/4e344dadf5e1fb76ac4f714b9e7296ed.png)
注意,我们在传递参数到 pluck
方法的时候,键对应的字段在后面,值对应的字段在前面。
此外,有的时候,我们从数据库返回的结果集比较大,一次性返回进行处理有可能会超出 PHP 内存限制,这时候,我们可以借助 chunk
方法将其分割成多个的组块依次返回进行处理:
$names = [];
DB::table('users')->orderBy('id')->chunk(5, function ($users) use (&$names) {
foreach ($users as $user) {
$names[] = $user->name;
}
});
以上代码的意思是对 users
按照 id
字段升序排序,然后将获取的结果集每次返回5个进行处理,将用户名依次放到 $names
数组中。打印 $names
,结果如下:
![66a698b67cf8652c79e0b441535dd871.png](https://img-blog.csdnimg.cn/img_convert/66a698b67cf8652c79e0b441535dd871.png)
聚合函数
在开发后台管理系统时,经常需要对数据进行统计、求和、计算平均值、最小值、最大值等,对应的方法名分别是 count
、sum
、avg
、min
、max
:
$num = DB::table('users')->count(); # 计数 9
$sum = DB::table('users')->sum('id'); # 求和 45
$avg = DB::table('users')->avg('id'); # 平均值 5
$min = DB::table('users')->min('id'); # 最小值 1
$max = DB::table('users')->max('id'); # 最大值 9
高级 Where 查询
前面我们已经用到过通过 where
方法构建查询子句,这里我们将系统介绍 WHERE 查询子句的各种构建。
基本查询
基本查询
最基本的 WHERE 查询子句就是通过 where
方法进行简单查询了:
DB::table('posts')->where('views', 0)->get(); # 此处等号可以省略
DB::table('posts')->where('views', '>', 0)->get();
DB::table('posts')->where('views', '<>', 0)->get();
第一个参数表示字段名,第二个参数表示运算符(支持SQL所有运算符),第三个参数表示比较值。
like查询
有时候我们可能会对字段进行模糊查询,尤其是字符串匹配的时候:
DB::table('posts')->where('title', 'like', 'Laravel学院%')->get();
and查询
如果有多个 WHERE 条件怎么办?在查询构建器中,可以通过方法链轻松搞定:
DB::table('posts')->where('id', ', 10)->where('views', '>', 0)->get();
上述代码表示获取 where id < 10 and views > 0
的数据库记录,更多的条件用更多的 where
方法即可。此外,我们还可以通过传入数组参数的方式实现上述代码同样的功能:
DB::table('posts')->where([
['id', ', 10],
['views', '>', 0]
])->get();
or查询
在日常查询中,or 条件的查询也很常见,在查询构建器中,可以通过 orWhere
方法来实现:
DB::table('posts')->where('id', ', 10)->orWhere('views', '>', 0)->get();
上述代码表示获取 where id < 10 or views > 0
的数据库记录,多个