Laravel关联模型中过滤结果为空的结果集(has和with区别)


Posted in PHP onOctober 18, 2018

首先看代码:

$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关联模型中过滤结果为空的结果集(has和with区别),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
针对初学PHP者的疑难问答(1)
Oct 09 PHP
PHP在线生成二维码代码(google api)
Jun 03 PHP
php中Session的生成机制、回收机制和存储机制探究
Aug 19 PHP
php实现的css文件背景图片下载器代码
Nov 11 PHP
PHP使用array_fill定义多维数组的方法
Mar 18 PHP
PHP计算指定日期所在周的开始和结束日期的方法
Mar 24 PHP
WordPress中"无法将上传的文件移动至"错误的解决方法
Jul 01 PHP
ThinkPHP实现递归无级分类――代码少
Jul 29 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
Dec 19 PHP
使用Zttp简化Guzzle 调用
Jul 02 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 #PHP
php 读取文件夹下所有图片、文件的实例
Oct 17 #PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
Oct 16 #PHP
实现PHP中session存储及删除变量
Oct 15 #PHP
PHP实现用session来实现记录用户登陆信息
Oct 15 #PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
Oct 15 #PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
Oct 15 #PHP
You might like
用libTemplate实现静态网页的生成
2006/10/09 PHP
通过对服务器端特性的配置加强php的安全
2006/10/09 PHP
php增删改查示例自己写的demo
2013/09/04 PHP
Smarty变量用法详解
2016/05/11 PHP
Javascript倒计时代码
2010/08/12 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
2016/11/09 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
vue.js删除列表中的一行
2018/06/30 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
js校验开始时间和结束时间
2020/05/26 Javascript
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
django-filter和普通查询的例子
2019/08/12 Python
使用Html5实现异步上传文件,支持跨域,带有上传进度条
2016/09/17 HTML / CSS
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
美津浓巴西官方网站:Mizuno巴西
2019/07/24 全球购物
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
C语言50道问题
2014/10/23 面试题
2013年高中生自我评价
2013/10/23 职场文书
大学生党课思想汇报
2013/12/29 职场文书
物控部经理职务说明书
2014/02/25 职场文书
幼儿园毕业寄语
2014/04/03 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
青岛海底世界导游词
2015/02/11 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
升学宴家长致辞
2015/07/27 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书
Vue全局事件总线你了解吗
2022/02/24 Vue.js
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS