Laravel中的whereHas和orWhereHas怎么进行关联模型查询
发布时间 - 2025-11-16 00:00:00 点击率:次whereHas用于基于关联模型条件过滤主模型数据,如查找包含“spam”评论的文章;orWhereHas则以“或”连接多个关联条件,两者结合可实现复杂查询逻辑。
在 Laravel 中,whereHas 和 orWhereHas 是用于基于关联模型的条件来过滤主模型数据的强大方法。它们常用于处理 Eloquent 模型之间的关系查询,比如“查找拥有符合条件的评论的文章”这类场景。
whereHas:根据关联关系添加 WHERE 条件
whereHas 用来判断某个关联是否存在,并且可以对关联模型设置查询条件。只有当关联模型满足这些条件时,主模型才会被选中。
语法:
whereHas('relation', function ($query) { ... })示例:假设有一个 Post 模型和一个 Comment 模型,它们之间是一对多关系(一篇文章有多条评论)。
你想找出所有包含“spam”评论的文章:
$posts = Post::whereHas('comments', function ($query) {
$query->where('content', 'like', '%spam%');
})->get();
这会生成一条 SQL 查询,仅返回那些关联
评论中包含“spam”的文章。
orWhereHas:追加 OR 条件到关联查询
当你需要多个关联条件以“或”的方式连接时,可以使用 orWhereHas。它通常跟在 whereHas 后面,表示“或者满足另一个关联条件”。
示例:查找包含“spam”评论 或 被用户 ID 为 1 的用户评论过的文章:
$posts = Post::whereHas('comments', function ($query) {
$query->where('content', 'like', '%spam%');
})->orWhereHas('comments', function ($query) {
$query->where('user_id', 1);
})->get();
这个查询将返回满足任一条件的文章,相当于 SQL 中的 OR 关系。
嵌套与复杂条件组合
你也可以在 whereHas 内部使用更复杂的查询逻辑,比如多条件 AND 或分组。
例如:查找被用户 1 评论过且评论状态为“approved”的文章:
$posts = Post::whereHas('comments', function ($query) {
$query->where('user_id', 1)
->where('status', 'approved');
})->get();
如果想实现“用户 1 发过 approved 评论”或“有内容含 spam 的评论”,就可以结合 whereHas 和 orWhereHas:
$posts = Post::whereHas('comments', function ($query) {
$query->where('user_id', 1)->where('status', 'approved');
})->orWhereHas('comments', function ($query) {
$query->where('content', 'like', '%spam%');
})->get();
has 和 orWhereHas 的区别
注意区分:has 只检查关联是否存在(不加条件),而 whereHas 允许你指定关联模型的具体查询条件。同理,orHas 和 orWhereHas 也有类似区别。
例如:
- has('comments'):只要有评论就匹配
- whereHas('comments', fn($q) => $q->where('visible', 1)):必须有可见的评论才匹配
基本上就这些。合理使用 whereHas 和 orWhereHas,可以让你轻松实现基于关联模型的复杂筛选逻辑,写出清晰又高效的 Eloquent 查询。
# laravel
# app
# 区别
# sql
# function
# 多个
# 多条
# 是否存在
# 也有
# 让你
# 才会
# 当你
# 你想
# 这类
# 可以使用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
QQ浏览器网页版登录入口 个人中心在线进入
如何在Windows服务器上快速搭建网站?
如何为不同团队 ID 动态生成多个非值班状态按钮
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
网站图片在线制作软件,怎么在图片上做链接?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
教你用AI润色文章,让你的文字表达更专业
html如何与html链接_实现多个HTML页面互相链接【互相】
jQuery validate插件功能与用法详解
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
网站制作企业,网站的banner和导航栏是指什么?
如何在Windows 2008云服务器安全搭建网站?
Laravel如何实现事件和监听器?(Event & Listener实战)
桂林网站制作公司有哪些,桂林马拉松怎么报名?
jQuery 常见小例汇总
如何在云主机快速搭建网站站点?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
Laravel集合Collection怎么用_Laravel集合常用函数详解
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
敲碗10年!Mac系列传将迎来「触控与联网」双革新
企业网站制作这些问题要关注
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
微信小程序 canvas开发实例及注意事项
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
Laravel Docker环境搭建教程_Laravel Sail使用指南
详解Android——蓝牙技术 带你实现终端间数据传输
Linux后台任务运行方法_nohup与&使用技巧【技巧】
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
如何做网站制作流程,*游戏网站怎么搭建?
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
如何在服务器上三步完成建站并提升流量?
JS中对数组元素进行增删改移的方法总结
如何用西部建站助手快速创建专业网站?
油猴 教程,油猴搜脚本为什么会网页无法显示?
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
微信小程序 HTTPS报错整理常见问题及解决方案
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
Laravel如何创建自定义Artisan命令?(代码示例)
JS弹性运动实现方法分析
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口

