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

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 代码编程 发布于1年前 更新于9个月前 1.9K+

当我们谈论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

喜欢就支持一下吧!

版权声明:除却声明转载或特殊注明,否则均为艾林博客原创文章,分享是一种美德,转载请保留原链接,感谢您的支持和理解

车到山前必有路,船到桥头自然直。

佚名

推荐阅读

构建高效稳定的PHP应用:PHP服务器性能优化与架构设计

本文围绕PHP、Linux服务器和前端程序,探讨如何构建高效稳定的PHP应用。文章首先介绍了PHP服务器性能优化的关键步...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 02月27日

thinkphp 模型withCount方法如何指定COUNT字段

本文将详细介绍如何在 ThinkPHP 模型中使用 withCount 方法来获取关联模型的计数信息。通过指定 COUN...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 01月03日

深度解析:PHP Laravel 框架中的缓存策略与优化

深入剖析 PHP Laravel 框架中的缓存策略,涵盖缓存驱动原理、应用场景及优化技巧,助力开发者提升应用性能。

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月04日

告别纠结:MySQL中INT字段的默认值应该用0还是NULL?

还在为MySQL INT字段的默认值是 0 还是 NULL 而犹豫不决吗?本文将一篇讲透两者的本质区别,破除“NULL影...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 08月26日

深入理解PHP DateTime类:全面指南

本文深入探讨PHP的DateTime类,提供了创建DateTime对象、格式化、修改、时区处理等多个方面的广泛示例代码,...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月15日

Laravel 路由缓存问题排查与解决方案

本文讲述在 Laravel + PHP 项目中,使用 php artisan route:cache 缓存路由时部分路由...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月06日

mysql常用函数以及示例

这篇文章将介绍MySQL数据库中最常用的函数,帮助您在数据处理、查询和操作中更加高效。我们将通过实例来演示这些函数的用法...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 01月18日

实现微信小程序与服务端流式数据交互:打造实时打字效果

本文深入探讨了如何利用微信小程序与服务端之间的流式数据交互,实现一个引人入胜的实时打字效果。通过详细解析代码实现,本文展...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 06月14日