Laravel关联模型中如何过滤结果为空的结果集
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,小编给大家分享一下Laravel关联模型中如何过滤结果为空的结果集,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!首先看代码
千家信息网最后更新 2026年10月31日Laravel关联模型中如何过滤结果为空的结果集
小编给大家分享一下Laravel关联模型中如何过滤结果为空的结果集,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
首先看代码:
$userCoupons = UserCoupons::with(['coupon' => function($query) use($groupId){ return $query->select('id', 'group_id', 'cover', 'group_number', 'group_cover')->where([ 'group_id' => $groupId, ]);}])// 更多查询省略...数据结构是三张表用户优惠券表(user_coupons)、优惠券表(coupons),商家表(corps),组优惠券表(group_coupons) (为了方便查看,后两项已去除)
这里我本意想用模型关联查出用户优惠券中属于给定组gourpId的所有数据(如果为空该条数据就不返回)。
但有些结果不是我想要的:
array(20) { ["id"]=> int(6) ["user_id"]=> int(1) ["corp_id"]=> int(1) ["coupon_id"]=> int(4) ["obtain_time"]=> int(1539739569) ["receive_time"]=> int(1539739569) ["status"]=> int(1) ["expires_time"]=> int(1540603569) ["is_selling"]=> int(0) ["from_id"]=> int(0) ["sell_type"]=> int(0) ["sell_time"]=> int(0) ["sell_user_id"]=> int(0) ["is_compose"]=> int(0) ["group_cover"]=> string(0) "" ["is_delete"]=> int(0) ["score"]=> int(100) ["created_at"]=> NULL ["updated_at"]=> NULL ["coupon"]=> NULL // 注意返回了coupons为空的数据}记录中有的coupon有记录,有的为空。想想也是,with只是用sql的in()实现的所谓预加载。无论怎样主user_coupons的数据都是会列出的。
它会有两条sql查询,第一条查主数据,第二条查关联,这里第二条sql如下:
select `id`, `group_id`, `cover`, `group_number`, `group_cover` from `youquan_coupons` where `youquan_coupons`.`id` in (1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14) and (`group_id` = 1) and `youquan_coupons`.`deleted_at` is null
如果第二条为空,主记录的关联字段就是NULL。
后来看到了Laravel关联的模型的has()方法,has()是基于存在的关联查询,下面我们用whereHas()(一样作用,只是更高级,方便写条件)
这里我们思想是把判断有没有优惠券数据也放在第一次查询逻辑中,所以才能实现筛选空记录。
加上whereHas()后的代码如下
$userCoupons = UserCoupons::whereHas('coupon', function($query) use($groupId){ return $query->select('id', 'group_id', 'cover', 'group_number', 'group_cover')->where([ 'group_id' => $groupId, ]); })->with(['coupon' => function($query) use($groupId){ return $query->select('id', 'group_id', 'cover', 'group_number', 'group_cover'); }])-> // ...看下最终的SQL:
select * from `youquan_user_coupons` where exists (select `id`, `group_id`, `cover`, `group_number`, `group_cover` from `youquan_coupons` where `youquan_user_coupons`.`coupon_id` = `youquan_coupons`.`id` and (`group_ids` = 1) and `youquan_coupons`.`deleted_at` is null) and (`status` = 1 and `user_id` = 1)
这里实际上是用exists()筛选存在的记录。然后走下一步的with()查询,因为此时都筛选一遍了,所以with可以去掉条件。
显然区分这两个的作用很重要,尤其是在列表中,不用特意去筛选为空的数据,而且好做分页。
以上是"Laravel关联模型中如何过滤结果为空的结果集"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
数据
关联
结果
优惠券
优惠
查询
模型
篇文章
代码
作用
内容
只是
更多
条件
用户
重要
高级
想想也是
不怎么
不用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网黑科技
科技互联网公司装修
金诺互联网科技
互联网金融与金融科技
猪兼强互联网科技
西安互联网科技
善班互联网科技
云电互联网科技
腾讯科技 互联网女皇
互联网科技的未来发展
卫星互联网科技股票
深圳前海聚择互联网科技有限公司
顶级互联网科技成果有哪些
佳云科技和互联网广告
翼展科技 首家互联网医院
工业互联网展湾科技股份有限公司
21世纪互联网科技成就
唐山双旺合互联网科技产业园
互联网科技的前景
保山浩联互联网科技有限公司
互联网科技卖菜
互联网科技公司招聘
链环科技传统企业怎么转型互联网
广西互联网科技孵化中心
明优互联网科技有限公司
卓翼科技产业互联网合作
产业互联网科技服务公司
本届互联网大会上的黑科技
互联网科技品牌
利用互联网等科技手段