Laravel 中,优雅地构建数据库查询条件的方法主要依赖于 Eloquent ORM查询构建器。和 ThinkPHP 类似,Laravel 提供了灵活的查询构建方式,支持链式调用、条件构建、范围查询等功能。通过这些方式,你可以轻松构建复杂的查询条件,保持代码简洁且易于维护。

目录

  1. Eloquent ORM 查询条件
  2. 查询构建器
  3. 使用闭包定义查询范围
  4. 查询条件的动态构建
  5. 总结

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 使用 whereNullwhereNotNull 查询空值

// 查询没有设置邮箱地址的用户
$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 类似的查询构建:

  • 使用 链式查询:支持 whereorWherewhereIn 等条件。
  • 使用 作用域:可以在模型中定义常用的查询条件,提高代码复用性。
  • 动态查询条件:可以根据用户输入动态添加查询条件。
  • 使用 全局作用域 自动应用某些条件。

通过这些方法,Laravel 提供了非常灵活的数据库查询构建方式,帮助你优雅地处理复杂的查询条件。