
本文介绍如何使用 Laravel Eloquent 实现类似 SQL 中 WHERE column1 + column2 = column3 的列间条件查询,重点讲解 whereRaw() 的正确用法、安全注意事项及实用替代方案。
本文介绍如何使用 laravel eloquent 实现类似 sql 中 `where column1 + column2 = column3` 的列间条件查询,重点讲解 `whereraw()` 的正确用法、安全注意事项及实用替代方案。
在 Laravel 开发中,当需要根据数据库表中多列之间的数学或逻辑关系筛选记录(例如 price + amount = total),而非简单的等值或范围匹配时,Eloquent 并未提供直接的链式方法(如 whereSumEquals())。此时,应借助底层 SQL 表达能力,在保持 Eloquent 风格的同时精准实现业务逻辑。
最常用且推荐的方式是使用 whereRaw() 方法。它允许你插入原生 SQL 片段作为 WHERE 条件,同时仍可复用 Eloquent 的模型管理、自动类型转换和查询构建器链式调用优势。以 prices 表为例:
use App\Models\Price;
$validNames = Price::select('name')
->whereRaw('price + amount = total')
->get()
->pluck('name')
->toArray();
// 返回: ['name1', 'name3']✅ 关键说明:
-
whereRaw()中的表达式直接交由数据库执行,因此支持所有 MySQL(或其他驱动)原生运算符(+,-,*,/,=,!=,>, 函数如DATEDIFF()等); - 列名无需加表前缀或反引号(除非含特殊字符),Laravel 默认信任开发者输入——但务必确保列名拼写准确;
- 若需传入外部变量(如动态阈值),切勿字符串拼接,而应使用参数绑定防止 SQL 注入:
// ✅ 安全:使用 ? 占位符绑定参数
Price::whereRaw('price + amount > ?', [$threshold])->get();
// ✅ 或命名绑定(更清晰)
Price::whereRaw('price + amount BETWEEN ? AND ?', [10, 50])->get();⚠️ 注意事项:
-
whereRaw()不做任何 SQL 转义,错误的表达式会导致查询失败或意外结果;建议先在数据库客户端验证原始 SQL; - 在复杂查询中混合使用
whereRaw()与其他约束(如where('status', 1))时,注意逻辑优先级,必要时用括号包裹whereRaw()条件; - 若该列间关系频繁使用,可考虑在数据库层面添加生成列(Generated Column) 或 检查约束(CHECK Constraint),并在应用层辅以模型访问器(Accessors)提升可读性:
// 在 Price 模型中定义访问器(仅用于读取逻辑,不参与查询)
protected $appends = ['is_balance_valid'];
public function getIsBalanceValidAttribute()
{
return $this->price + $this->amount === $this->total;
}总之,whereRaw() 是处理列间关系查询的简洁、高效且符合 Laravel 哲学的解决方案。只要谨慎使用、合理绑定参数并配合单元测试验证,即可安全、可靠地支撑各类业务场景。


















