如何在 Laravel Eloquent 中创建具有多重 WHERE 条件的查询
您是否曾经有过这样的想法:“我需要根据三个不同的条件过滤记录,但 Eloquent 的语法有点令人困惑”?如果是这样——您并不孤单。Stack Overflow 上的问题“如何使用 Laravel Eloquent 创建多重 WHERE 子句查询?”已经获得了数千次浏览,这并不奇怪。数据库操作是任何 PHP 应用程序的核心,而构建复杂查询的能力是区分新手和专家的关键。
在本文中,我们将详细讲解 在 Laravel Eloquent 中创建多重 WHERE 条件的所有方法:从最简单的链式调用到嵌套的逻辑结构。您将学习如何组合 AND 和 OR,如何对关联模型使用 whereHas,以及如何避免常见错误。让我们开始吧!
基本语法:WHERE 链式调用
添加多个条件最直接的方法就是连续多次调用 where()。默认情况下,所有条件通过 AND 连接。
// 获取所有 status = 'active' 且 role = 'admin' 的用户$users = User::where('status', 'active') ->where('role', 'admin') ->get();
// 等效的 SQL:// SELECT * FROM users WHERE status = 'active' AND role = 'admin'也可以传递一个条件数组:
$users = User::where([ ['status', '=', 'active'], ['role', '=', 'admin'],])->get();两种方法都有效,但第一种方法可读性更好,尤其是在条件很多的情况下。
OR 条件:当需要“或”时
但如果我们需要查找要么是活跃用户、要么是管理员的用户呢?这时就需要用到 orWhere()。
// status = 'active' 或 role = 'admin' 的用户$users = User::where('status', 'active') ->orWhere('role', 'admin') ->get();
// SQL: SELECT * FROM users WHERE status = 'active' OR role = 'admin'⚠️ 重要提醒: 如果您混合使用 where 和 orWhere,请记住运算符的优先级。Laravel 会按顺序处理它们,因此结果可能与预期不同。
一个带有陷阱的例子
// 我们想要:(status = 'active' AND role = 'admin') OR (plan = 'premium')$users = User::where('status', 'active') ->where('role', 'admin') ->orWhere('plan', 'premium') ->get();
// SQL: WHERE status = 'active' AND role = 'admin' OR plan = 'premium'// 这 不是 我们想要的!要获得正确的结果,请使用带闭包的分组:
$users = User::where(function ($query) { $query->where('status', 'active') ->where('role', 'admin');})->orWhere('plan', 'premium') ->get();
// SQL: WHERE (status = 'active' AND role = 'admin') OR plan = 'premium'嵌套 WHERE:条件分组
当逻辑变得更复杂时,嵌套闭包就派上用场了。这是创建复杂条件最强大的工具。
// (age > 18 AND status = 'active') OR (age <= 18 AND parent_approved = 1)$users = User::where(function ($query) { $query->where('age', '>', 18) ->where('status', 'active');})->orWhere(function ($query) { $query->where('age', '<=', 18) ->where('parent_approved', 1);})->get();这段代码读起来像一本书:“查找成年且活跃的用户,或者未成年但获得家长批准的用户”。
带运算符的条件:WHERE IN, BETWEEN, NULL
Eloquent 支持所有标准的 SQL 运算符。以下是一些有用的:
whereIn — 检查是否在列表中
<