Laravel Eloquent 中的多重 WHERE:从新手到专家

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何在 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 — 检查是否在列表中



<

博客

书籍推荐