在 Laravel 中,优雅地构建数据库查询条件的方法主要依赖于 Eloquent ORM 和 查询构建器。和 ThinkPHP 类似,Laravel 提供了灵活的查询构建方式,支持链式调用、条件构建、范围查询等功能。通过这些方式,你可以轻松构建复杂的查询条件,保持代码简洁且易于维护。
目录
- Eloquent ORM 查询条件
- 查询构建器
- 使用闭包定义查询范围
- 查询条件的动态构建
- 总结
1. Eloquent ORM 查询条件
在 Laravel 中,Eloquent
是一个非常强大的 ORM,它允许你通过模型与数据库进行交互。你可以利用它来构建灵活的查询条件。
1.1 基本查询条件
// 查询用户表中年龄大于等于 18 的用户
$users = User::where('age', '>=', 18)->get();
// 查询状态为 'active' 的所有用户
$activeUsers = User::where('status', 'active')->get();
// 复合条件:查询年龄大于等于 18 且状态为 'active' 的用户
$activeUsers = User::where('age', '>=', 18)->where('status', 'active')->get();
1.2 使用 orWhere
来添加“或”条件
// 查询年龄大于等于 18 或者状态为 'active' 的用户
$users = User::where('age', '>=', 18)
->orWhere('status', 'active')
->get();
1.3 使用 whereIn
查询多个值
// 查询状态为 'active' 或 'pending' 的用户
$users = User::whereIn('status', ['active', 'pending'])->get();
1.4 使用 whereNull
和 whereNotNull
查询空值
// 查询没有设置邮箱地址的用户
$users = User::whereNull('email')->get();
// 查询邮箱地址不为空的用户
$users = User::whereNotNull('email')->get();
1.5 使用 whereDate
, whereMonth
等日期条件
// 查询生日在今天的用户
$users = User::whereDate('birthday', today())->get();
// 查询生日在 3 月的用户
$users = User::whereMonth('birthday', 3)->get();
2. 查询构建器
除了 Eloquent ORM,Laravel 还提供了 查询构建器(Query Builder),它可以帮助你更灵活地构建复杂的查询条件。查询构建器通过链式调用来构建 SQL 查询。
2.1 基本查询
// 查询用户表中所有的用户
$users = DB::table('users')->get();
// 查询年龄大于等于 18 的所有用户
$users = DB::table('users')->where('age', '>=', 18)->get();
2.2 链式条件查询
// 查询状态为 'active' 且年龄大于 18 的用户
$users = DB::table('users')
->where('status', 'active')
->where('age', '>=', 18)
->get();
2.3 使用 orWhere
进行 OR 条件查询
// 查询状态为 'active' 或年龄大于等于 18 的用户
$users = DB::table('users')
->where('status', 'active')
->orWhere('age', '>=', 18)
->get();
2.4 whereIn
用于多个值的查询
// 查询状态为 'active' 或 'pending' 的用户
$users = DB::table('users')
->whereIn('status', ['active', 'pending'])
->get();
2.5 whereBetween
查询范围条件
// 查询年龄在 18 到 25 岁之间的用户
$users = DB::table('users')
->whereBetween('age', [18, 25])
->get();
3. 使用闭包定义查询范围
Laravel 提供了 查询范围(Query Scopes),它允许你通过模型中的方法定义常用的查询条件。这样做可以提高代码的重用性和可维护性。
3.1 定义本地作用域(Local Scope)
你可以在 Eloquent 模型中定义常用的查询条件作为方法:
// 在 User 模型中定义作用域
class User extends Model
{
public function scopeActive($query)
{
return $query->where('status', 'active');
}
public function scopeAgeGreaterThan($query, $age)
{
return $query->where('age', '>=', $age);
}
}
然后,你可以在查询中使用这些作用域:
// 查询所有活跃用户
$activeUsers = User::active()->get();
// 查询年龄大于 18 且状态为 'active' 的用户
$users = User::active()->ageGreaterThan(18)->get();
3.2 使用动态作用域(Dynamic Scopes)
Laravel 允许使用 动态作用域,这可以在运行时动态构建查询条件:
// 在查询中使用动态作用域
$users = User::whereStatus('active')
->whereAge('>=', 18)
->get();
3.3 全局作用域(Global Scopes)
如果你希望每次查询都应用某个条件,可以使用全局作用域。例如,每次查询都加上“状态为 active
”的条件:
class User extends Model
{
protected static function booted()
{
static::addGlobalScope('active', function (Builder $builder) {
$builder->where('status', 'active');
});
}
}
这样,你所有的查询都会自动包含 where status = 'active'
。
4. 查询条件的动态构建
在某些情况下,你可能需要根据用户的输入动态地构建查询条件。Laravel 允许你在运行时动态构建查询条件。
4.1 动态构建查询条件
$query = User::query();
if ($status) {
$query->where('status', $status);
}
if ($age) {
$query->where('age', '>=', $age);
}
if ($name) {
$query->where('name', 'like', "%$name%");
}
$users = $query->get();
4.2 使用条件数组来简化查询
如果条件很多,可以使用 array_filter
来动态添加条件:
$conditions = array_filter([
'status' => $status,
'age' => $age ? ['>=', $age] : null,
'name' => $name ? ['like', "%$name%"] : null,
]);
$query = User::query();
foreach ($conditions as $field => $value) {
if (is_array($value)) {
$query->where($field, $value[0], $value[1]);
} else {
$query->where($field, $value);
}
}
$users = $query->get();
5. 总结
在 Laravel 中构建数据库查询条件非常优雅且灵活,使用 Eloquent ORM 和 查询构建器 可以帮助你轻松构建各种查询条件。你可以通过以下方式来实现和 ThinkPHP 类似的查询构建:
- 使用 链式查询:支持
where
、orWhere
、whereIn
等条件。 - 使用 作用域:可以在模型中定义常用的查询条件,提高代码复用性。
- 动态查询条件:可以根据用户输入动态添加查询条件。
- 使用 全局作用域 自动应用某些条件。
通过这些方法,Laravel 提供了非常灵活的数据库查询构建方式,帮助你优雅地处理复杂的查询条件。