跳到主要内容
PHP

Laravel 系列:orWhere 条件式(thinkphp可做参考)

管

管理员

https://learnku.com/articles/6044/laravel-series-orwhere-conditional

2020年02月13日 3,165 次阅读
本页目录

Laravel,一个优雅的 PHP 框架,也是目前最火的 PHP 项目,其生态积极健康,社区也很活跃。:sparkling_heart:

目前我对于学习 Laravel 还是有些吃力的,基本方法都能很快掌握,但是一旦遇到了比较复杂的问题后,想要去查看源码进行调试的时候,总是会显得不知所措。:dizzy_face: :dizzy_face: :dizzy_face: 官方文档不会把所有方法都讲一遍,也不会把方法的各个使用场景都描述一遍,所以遇到这些问题去看文档一般解决不了。

改正一下,针对我下面这个问题,其实文档中有,是自己没有看仔细,不好意思啦:传送门

这次我遇到的问题是 orWhere 条件式造成的查询语句写法始终不是自己想要的。

场景描述

我需要根据商品分类、商品名称和条形码这三个查询条件去取出结果集,这三者的关系是:商品分类 and (商品名称 or 条形码)

错误尝试

第一次写出来的代码是这样的:

$goodsModel = new Goods;

if (!empty($category)) {
    $goodsModel = $goodsModel->where('category', $category);
}

if (!empty($keyword)) {
    $goodsModel = $goodsModel->where('name', 'like', "%{$keyword}%")->orWhere('barcode', 'like', "%{$keyword}%");
}

$goodsList = $goodsModel->limit(10)->get();

然后会发现这样的写法会导致三者的关系变成了:商品分类 and 商品名称 or 条形码。:shit: :shit: :shit:

谷歌一下

也是找了一会才找到,如果需要将 or 两边的查询项作为一组查询条件,那么建议使用 where 的闭包方式。

闭包

这种方式将 or 部分写成 closure 传入 where(),与 Eloquent 风格一致,可读性较好。代码如下:

if (!empty($keyword)) {
    $goodsModel = $goodsModel->where(function ($query) use ($keyword) {
        $query->where('name', 'like', "%{$keyword}%")->orWhere('barcode', 'like', "%{$keyword}%");
    });
}

原生

实在想不出怎么写,就写原生 SQL 好了。这也是最后一种保险但不提倡的做法了吧,代码如下:

if (!empty($keyword)) {
    $keyword = "%{$keyword}%";
    $goodsModel = $goodsModel->whereRaw('(name like ? or barcode like ?)', [$keyword, $keyword]);
}

需要注意的是,单引号里面的括号是不能省略的,否则一样会导致这三者的关系是:商品分类 and 商品名称 or 条形码。

占位符

再友情提示一下,你可能会对 like ? 觉得奇怪,我第一次写的时候直接是 whereRaw('name like "%?%"', [$keyword]'),但是这样是没效果的,原因是占位符是对某一个完整的值进行占位,而不是简单的替换效果,所以需要将 like 的参数全部用 ? 替代,将百分号的拼接放在后面的占位数组的变量中去。  

参考链接:How do you parameterize whereRaw() in the query builder?

Related

相关文章

同分类文章 →
2026年07月11日 PHP

laravel什么样的方法适合放在模型中?什么适合用专门的服务类? cachedFavIds适合放在模型中吗?

一、适合放在模型中的方法Laravel 采用 ActiveRecord 风格,模型本身就是"数据 + 围绕该数据的操作"的载体。以下几类方法适合放模型: 关联关系:belongsTo、morphTo、hasMany 等。如 UserFav::userfavable()、UserFav::us

2026年04月13日 PHP

Vue3 静态文件放在同域名 Laravel 项目下

核心思路是:Vue3 构建后的静态文件放到 Laravel 的 public/ 目录下,通过 Laravel 路由的 catch-all 机制让 SPA 的前端路由正常工作。方案说明以 xx.com/admin 为例,整体架构如下:请求流程:xx.com/admin/* → Laravel

2025年08月18日 PHP

Laravel Eloquent 中可以通过静态方式调用的方法

在 Laravel Eloquent 中,可以通过静态方式调用的方法包括:1. 查询作用域 (Scopes)// 可以静态调用UserComment::active()->get();UserComment::where('status', 1)->first();2. Eloquent 内置的查询方法UserComment::fi

WeChat

扫码加我微信

微信二维码