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

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

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

喜欢就支持一下吧!

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

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

佚名

推荐阅读

数据库索引深入解析:原理、类型及优化策略

本文深入解析了数据库索引的原理、类型及优化策略,涵盖索引的常见类型(如单列索引、复合索引、全文索引等)及其应用场景,并提...

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

PHP 运算符大全(完整详细版)

本文详细介绍了 PHP 中的各种运算符,包括算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、字符串运算符、数组...

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

PHP中的任意精度数学计算:探索BCMath扩展

详细介绍使用PHP BCMath扩展进行高精度数学计算的方法,包括加法、减法、乘法、除法、求余、乘方、平方根计算以及设置...

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

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

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

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

PHP 执行时间与内存管理解析

本文详解PHP脚本的max_execution_time、memory_limit核心参数,对比Nginx与PHP-FP...

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

容易上手的Python项目:构建你的第一个Web爬虫

这篇文章提供了一个简单的指南,教您如何使用Python及其库requests和BeautifulSoup来构建您的第一个...

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

OpenAPI规范与标准化响应实践

本文系统阐述了如何通过OpenAPI规范设计RESTful接口,详细解析API Key、OAuth 2.0、JWT三大认...

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

深入解析 JavaScript 和 TypeScript 的区别:选型和实战指南

本文详细解析了 JavaScript 和 TypeScript 的核心区别,包括类型系统、开发体验、错误检测等方面,并通...

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