艾林博客 - 技术交流与经验分享的个人博客

Laravel ORM(Eloquent)深入探究:强大的查询构造器

Liner51

Liner51

10个月前更新

当我们谈论Laravel的Eloquent ORM时,我们不仅仅是在谈论模型和数据库之间的关系,我们还在谈论如何利用其提供的强大查询构造器。在本篇博客中,我们将重点介绍Eloquent提供的where方法,这是数据库查询中最为常用且强大的功能之一。

基础的where查询

Eloquent的where方法允许你指定查询条件来过滤查询结果。最基本的where方法接收三个参数:字段名、比较运算符和需要比较的值。

// 基本的相等查询
$users = User::where('status', '=', 'active')->get();

// 简写方式,默认为相等
$users = User::where('status', 'active')->get();

链式where查询

你可以链式调用where方法来增加查询条件,以此创建更复杂的SQL语句。

$users = User::where('status', 'active')
             ->where('type', 'admin')
             ->get();

where查询的多种形式

Eloquent提供了多种where查询,以支持不同类型的数据库操作。

where方法的变体

  • orWhere:增加一个“或”条件到查询中;
$users = User::where('status', 'active')->orWhere('type', 'admin')->get();
  • whereBetween:检索字段值介于两个值之间的数据列;
$users = User::whereBetween('votes', [1, 100])->get();
  • whereIn:字段值在给定数组中;
$users = User::whereIn('id', [1, 2, 3])->get();
  • whereNullwhereNotNull:字段值为 NULL 或者不为 NULL;
$users = User::whereNull('updated_at')->get();

高级子查询

Eloquent也支持更高级的子查询构造,这允许你在where方法中使用闭包,甚至是另一个查询构造器实例。

$users = User::where('votes', '>', function ($query) {
    $query->select('votes')->from('users')->orderBy('votes', 'desc')->limit(1);
})->get();

where列比较

你还可以在where方法中比较两个数据库列。

$users = User::whereColumn('first_name', 'last_name')->get();

$users = User::whereColumn([
    ['first_name', '=', 'last_name'],
    ['updated_at', '>', 'created_at']
])->get();

原生表达式

有时,你可能需要使用原生的SQL片段,这时可以使用whereRaw方法。

$users = User::whereRaw('age > ? and votes = 100', [25])->get();

使用数组构建where条件的查询

在Laravel的Eloquent ORM中,除了使用链式调用和各种where方法变体外,你还可以通过传递数组给where方法来构建查询条件。这种方式使得构建查询条件变得更加简洁和直观,特别是当你需要同时应用多个查询条件时。

数组形式的where查询

你可以将多个条件封装成数组,直接传递给where方法。每个子数组代表一个条件,通常包含字段名、操作符和比较值三个部分。

$users = User::where([
    ['status', '=', 'active'],
    ['type', '=', 'admin'],
    ['votes', '>', 100]
])->get();

在这个例子中,我们构建了一个查询,它将只返回statusactivetypeadminvotes大于100的用户。

简化操作符

在大多数情况下,当条件为等于(=)时,操作符可以被省略,Laravel会默认使用等于(=)操作符,因此上面的查询可以被简化为:

$users = User::where([
    ['status', 'active'],
    ['type', 'admin'],
    ['votes', '>', 100]
])->get();

此简化形式使得代码更加清晰,并提高了可读性。

利用数组构建复杂查询

使用数组构建where条件的能力使得结合使用各种类型的where方法成为可能,例如orWherewhereIn等,让你可以构建更加复杂和灵活的查询条件。

$users = User::where([
    ['status', 'active'],
    ['created_at', '>', now()->subYear()]
])->orWhere(function($query) {
    $query->where('votes', '>', 100)
          ->whereIn('type', ['admin', 'super-admin']);
})->get();

在这个例子中,我们构建了一个复杂的查询,它会返回statusactive并且创建时间在过去一年之内的用户,或者votes大于100且typeadminsuper-admin的用户。

使用模型作用域

为了代码的可重用性和清晰性,你可以定义本地作用域。本地作用域允许你为模型定义通用的查询约束集合,以便在应用中重用。

class User extends Model
{
    public function scopeOfType($query, $type)
    {
        return $query->where('type', $type);
    }
}

$admins = User::ofType('admin')->get();

结论与实践

Laravel的Eloquent ORM提供的where方法非常灵活且强大,它可以处理你的绝大部分数据查询需求。通过巧妙地串联各种where方法和利用Eloquent的其他高级功能,你可以轻松构建出既复杂又高效的数据库查询。

不要忘记,最佳实践是始终关注你的查询性能,并确保使用索引来优化查询速度。此外,对于复杂的查询逻辑,别忘了利用本地作用域来简化代码和增加可读性。

The End
代码编程

喜欢就支持一下把!

(0)
人身之所重者元气;国家之所重者人才。

《格言联璧》

为您推荐