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

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

当我们谈论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中,递归获取父级和子级数据是一个常见的需求。本文将详细介绍如何使用递归方法分别获取父级和子级数据,并提供了示例代...

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

Phpstorm+Phpstudy 搭建xdebug调试

在日常的工作或者学习中,项目调试是是开发过程中不可缺少的存在,他不仅能帮你更直接的作为一个观察者查阅项目运行流程,更重要...

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

深入理解WebAssembly:架构未来的Web应用

深入探索WebAssembly(Wasm)的强大能力,了解它如何改变Web开发的面貌。本文提供了对WebAssembly...

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

PHPDoc 注释标签详解:全面指南

探索 PHPDoc 中的关键标签和它们的具体用途,增进代码文档化的技巧,提高 PHP 项目的可维护性与可读性。

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

PHP中[guzzlehttp/guzzle] 的使用方法

如何在PHP中使用GuzzleHttp库进行HTTP请求。我们将详细解释如何使用GuzzleHttp发送GET、POST...

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

提升开发效率:PHPStorm常用插件大全

本文详细介绍了PHPStorm常用的插件,包括了日常开发中的热门插件,帮助开发者提升开发效率和代码质量。

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

PHP 一匿名函数、回调函数和闭包函数的介绍

本文详细介绍了PHP中的匿名函数、回调函数和闭包函数的概念、用法和具体示例。匿名函数是没有名字的函数,可以在任何需要函数...

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

深入实现Laravel API认证:如何配置和使用JWT中间件

本文深入探讨了如何在Laravel中实现JWT中间件,以保护API安全。包含了JWT的安装、配置、中间件的创建和注册、路...

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