
本文详解如何在 laravel 中使用 `selectraw` 时,对同一字段(如 `category_id`)进行多个值的匹配,指出 `where category_id = 1 and category_id = 2` 在逻辑上不可能成立,并推荐使用 `wherein()` 实现“或”语义的多值查询。
在 Laravel 的查询构建器中,::selectRaw() 是执行自定义 SQL 字段选择的常用方式,但它本身不改变 where 子句的语义逻辑。你当前的写法:
->where('category_id', '=', 1)
->where('category_id', '=', 2)等价于 SQL 中的 WHERE category_id = 1 AND category_id = 2 —— 这永远返回空结果,因为单行记录的 category_id 不可能同时等于两个不同整数值。
✅ 正确做法是使用 whereIn() 方法,它对应 SQL 的 IN 子句,语义为“匹配任意一个值”,即 WHERE category_id IN (1, 2):
$query = self::selectRaw(is_array($fields) ? implode(', ', $fields) : $fields)
->whereIn('category_id', [1, 2])
->where(function ($q) use ($search) {
if ($search) {
$q->where('group_name', $search); // 推荐显式写法,避免数组语法歧义
}
});⚠️ 注意事项:
- whereIn() 是标准且安全的解决方案,支持数组动态传参(如 $ids = [1, 2, 5]),也兼容空数组(此时会生成 WHERE 1=0,合理短路);
- 避免误用 where() 连续调用同字段——除非你本意是链式 AND 条件(如 status = 1 AND deleted_at IS NULL),否则对同一字段多值匹配必须用 whereIn、orWhereIn 或 whereBetween 等语义明确的方法;
- 若需实现“同时属于多个分类”这类高级逻辑(例如某商品关联多个 category),则属多对多关系查询,需通过中间表 JOIN + GROUP BY + HAVING COUNT 实现,而非单表 WHERE。
总结:WHERE column = A AND column = B 永假;应根据业务意图选择 whereIn()(任一匹配)、whereExists()(关联存在性)或聚合查询(全量满足)。在 selectRaw 场景下,语法与普通查询构建器完全一致,无需额外适配。










