查询构建器 #
一、查询构建器概述 #
1.1 什么是查询构建器 #
Laravel查询构建器提供了流畅的接口来构建数据库查询,支持链式调用,可以执行各种数据库操作。
php
use Illuminate\Support\Facades\DB;
$users = DB::table('users')
->where('active', 1)
->orderBy('name')
->get();
1.2 获取结果 #
php
// 获取所有结果
$users = DB::table('users')->get();
// 获取单行
$user = DB::table('users')->where('id', 1)->first();
// 获取单个值
$name = DB::table('users')->where('id', 1)->value('name');
// 获取列值
$names = DB::table('users')->pluck('name');
// 获取键值对
$names = DB::table('users')->pluck('name', 'id');
二、基础查询 #
2.1 SELECT查询 #
php
// 选择所有列
$users = DB::table('users')->get();
// 选择指定列
$users = DB::table('users')->select('name', 'email')->get();
// 添加列
$users = DB::table('users')
->select('name')
->addSelect('email')
->get();
// 使用表达式
$users = DB::table('users')
->select(DB::raw('COUNT(*) as count'))
->get();
// 去重
$users = DB::table('users')->distinct()->get();
2.2 WHERE条件 #
php
// 基本WHERE
$users = DB::table('users')->where('active', 1)->get();
// 比较运算符
$users = DB::table('users')->where('votes', '>=', 100)->get();
$users = DB::table('users')->where('votes', '<>', 100)->get();
$users = DB::table('users')->where('name', 'like', 'J%')->get();
// WHERE数组
$users = DB::table('users')->where([
['active', 1],
['votes', '>=', 100],
])->get();
// OR条件
$users = DB::table('users')
->where('active', 1)
->orWhere('votes', '>=', 100)
->get();
// WHERE分组
$users = DB::table('users')
->where('active', 1)
->where(function ($query) {
$query->where('votes', '>', 100)
->orWhere('name', 'Admin');
})
->get();
// SQL: WHERE active = 1 AND (votes > 100 OR name = 'Admin')
2.3 其他WHERE方法 #
php
// WHERE BETWEEN
$users = DB::table('users')
->whereBetween('votes', [1, 100])
->get();
// WHERE NOT BETWEEN
$users = DB::table('users')
->whereNotBetween('votes', [1, 100])
->get();
// WHERE IN
$users = DB::table('users')
->whereIn('id', [1, 2, 3])
->get();
// WHERE NOT IN
$users = DB::table('users')
->whereNotIn('id', [1, 2, 3])
->get();
// WHERE NULL
$users = DB::table('users')
->whereNull('deleted_at')
->get();
// WHERE NOT NULL
$users = DB::table('users')
->whereNotNull('email_verified_at')
->get();
// WHERE DATE
$users = DB::table('users')
->whereDate('created_at', '2024-01-01')
->get();
// WHERE YEAR/MONTH/DAY
$users = DB::table('users')->whereYear('created_at', 2024)->get();
$users = DB::table('users')->whereMonth('created_at', 1)->get();
$users = DB::table('users')->whereDay('created_at', 1)->get();
$users = DB::table('users')->whereTime('created_at', '12:00:00')->get();
// WHERE COLUMN
$users = DB::table('users')
->whereColumn('updated_at', '>', 'created_at')
->get();
// WHERE EXISTS
$users = DB::table('users')
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('orders')
->whereColumn('orders.user_id', 'users.id');
})
->get();
2.4 JSON查询 #
php
// JSON字段查询(MySQL 5.7+ / PostgreSQL)
$users = DB::table('users')
->where('options->language', 'zh')
->get();
// JSON包含
$users = DB::table('users')
->whereJsonContains('options->languages', 'en')
->get();
// JSON长度
$users = DB::table('users')
->whereJsonLength('options->languages', 3)
->get();
三、排序、分组、限制 #
3.1 排序 #
php
// ORDER BY
$users = DB::table('users')
->orderBy('name')
->get();
// 降序
$users = DB::table('users')
->orderBy('name', 'desc')
->get();
// 多列排序
$users = DB::table('users')
->orderBy('name')
->orderBy('votes', 'desc')
->get();
// 最新/最旧
$users = DB::table('users')->latest()->get();
$users = DB::table('users')->oldest()->get();
// 随机排序
$users = DB::table('users')->inRandomOrder()->get();
// 字段存在排序
$users = DB::table('users')
->orderByDesc('email_verified_at')
->get();
3.2 分组 #
php
// GROUP BY
$users = DB::table('users')
->select('department', DB::raw('COUNT(*) as count'))
->groupBy('department')
->get();
// HAVING
$users = DB::table('users')
->select('department', DB::raw('COUNT(*) as count'))
->groupBy('department')
->having('count', '>', 5)
->get();
// HAVING RAW
$users = DB::table('users')
->select('department', DB::raw('COUNT(*) as count'))
->groupBy('department')
->havingRaw('count > ?', [5])
->get();
3.3 限制和偏移 #
php
// LIMIT
$users = DB::table('users')->take(10)->get();
// 或
$users = DB::table('users')->limit(10)->get();
// OFFSET
$users = DB::table('users')->skip(10)->take(10)->get();
// 或
$users = DB::table('users')->offset(10)->limit(10)->get();
// 分页
$page = 2;
$perPage = 10;
$users = DB::table('users')
->offset(($page - 1) * $perPage)
->limit($perPage)
->get();
四、聚合函数 #
4.1 基本聚合 #
php
// COUNT
$count = DB::table('users')->count();
// MAX
$max = DB::table('users')->max('votes');
// MIN
$min = DB::table('users')->min('votes');
// SUM
$sum = DB::table('users')->sum('votes');
// AVG
$avg = DB::table('users')->avg('votes');
4.2 条件聚合 #
php
$count = DB::table('users')
->where('active', 1)
->count();
4.3 存在检查 #
php
// exists
$exists = DB::table('users')->where('email', 'john@example.com')->exists();
// doesntExist
$exists = DB::table('users')->where('email', 'john@example.com')->doesntExist();
五、JOIN查询 #
5.1 INNER JOIN #
php
$users = DB::table('users')
->join('posts', 'users.id', '=', 'posts.user_id')
->select('users.*', 'posts.title')
->get();
5.2 LEFT JOIN #
php
$users = DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
5.3 RIGHT JOIN #
php
$users = DB::table('users')
->rightJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
5.4 CROSS JOIN #
php
$users = DB::table('users')
->crossJoin('posts')
->get();
5.5 高级JOIN #
php
$users = DB::table('users')
->join('posts', function ($join) {
$join->on('users.id', '=', 'posts.user_id')
->where('posts.published', 1);
})
->get();
5.6 子查询JOIN #
php
$users = DB::table('users')
->joinSub(
DB::table('posts')->select('user_id', DB::raw('COUNT(*) as post_count'))->groupBy('user_id'),
'post_counts',
'users.id',
'=',
'post_counts.user_id'
)
->get();
六、UNION查询 #
php
$first = DB::table('users')
->whereNull('deleted_at');
$users = DB::table('users')
->whereNotNull('deleted_at')
->union($first)
->get();
七、插入数据 #
7.1 单条插入 #
php
DB::table('users')->insert([
'name' => 'John',
'email' => 'john@example.com',
'created_at' => now(),
]);
7.2 批量插入 #
php
DB::table('users')->insert([
['name' => 'John', 'email' => 'john@example.com'],
['name' => 'Jane', 'email' => 'jane@example.com'],
]);
7.3 插入并获取ID #
php
$id = DB::table('users')->insertGetId([
'name' => 'John',
'email' => 'john@example.com',
]);
7.4 插入或忽略 #
php
DB::table('users')->insertOrIgnore([
['name' => 'John', 'email' => 'john@example.com'],
]);
7.5 插入或更新 #
php
DB::table('users')->upsert([
['id' => 1, 'name' => 'John', 'email' => 'john@example.com'],
['id' => 2, 'name' => 'Jane', 'email' => 'jane@example.com'],
], ['id'], ['name', 'email']);
八、更新数据 #
8.1 基本更新 #
php
$affected = DB::table('users')
->where('id', 1)
->update(['votes' => 1]);
8.2 更新JSON字段 #
php
DB::table('users')
->where('id', 1)
->update(['options->language' => 'zh']);
8.3 增减数值 #
php
// 增加
DB::table('users')->increment('votes');
DB::table('users')->increment('votes', 5);
// 减少
DB::table('users')->decrement('votes');
DB::table('users')->decrement('votes', 5);
// 同时更新其他字段
DB::table('users')->increment('votes', 1, ['name' => 'John']);
九、删除数据 #
9.1 基本删除 #
php
$deleted = DB::table('users')->where('votes', '<', 100)->delete();
9.2 删除所有数据 #
php
DB::table('users')->delete();
// 清空表(重置自增ID)
DB::table('users')->truncate();
十、分页 #
10.1 简单分页 #
php
$users = DB::table('users')->paginate(15);
// 在视图中显示分页链接
{{ $users->links() }}
10.2 简单分页(无总数) #
php
$users = DB::table('users')->simplePaginate(15);
10.3 游标分页 #
php
$users = DB::table('users')->cursorPaginate(15);
10.4 分页属性 #
php
$users = DB::table('users')->paginate(15);
$users->count(); // 当前页数量
$users->total(); // 总数量
$users->currentPage(); // 当前页
$users->lastPage(); // 最后一页
$users->perPage(); // 每页数量
$users->hasMorePages(); // 是否有更多页
$users->items(); // 数据项
十一、子查询 #
11.1 SELECT子查询 #
php
$users = DB::table('users')
->addSelect([
'last_post' => DB::table('posts')
->select('title')
->whereColumn('user_id', 'users.id')
->latest()
->limit(1),
])
->get();
11.2 WHERE子查询 #
php
$users = DB::table('users')
->where('votes', '>', function ($query) {
$query->selectRaw('AVG(votes)')->from('users');
})
->get();
十二、调试 #
12.1 获取SQL #
php
// 获取SQL语句
$sql = DB::table('users')->where('active', 1)->toSql();
// 获取带绑定的SQL
$sql = DB::table('users')->where('active', 1)->dd();
12.2 记录查询 #
php
DB::listen(function ($query) {
logger($query->sql, $query->bindings);
});
十三、总结 #
13.1 核心方法 #
| 方法 | 说明 |
|---|---|
| select() | 选择列 |
| where() | 条件 |
| join() | 连接表 |
| orderBy() | 排序 |
| groupBy() | 分组 |
| paginate() | 分页 |
| insert() | 插入 |
| update() | 更新 |
| delete() | 删除 |
13.2 下一步 #
掌握了查询构建器后,让我们继续学习 Eloquent ORM,了解Laravel强大的对象关系映射!
最后更新:2026-03-28