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 Socket 编程
Apr 09 PHP
关于svn冲突的解决方法
Jun 21 PHP
php读取富文本的时p标签会出现红线是怎么回事
May 13 PHP
常见php数据文件缓存类汇总
Dec 05 PHP
php中Socket创建与监听实现方法
Jan 05 PHP
joomla数据库操作示例代码
Jan 06 PHP
php使用glob函数遍历文件和目录详解
Sep 23 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
PHP实现的超长文本分页显示功能示例
Jun 04 PHP
php 使用mpdf实现指定字段配置字体样式的方法
Jul 29 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
Oct 10 PHP
PHP与Web页面的交互示例详解二
Aug 04 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
用来解析.htpasswd文件的PHP类
2012/09/05 PHP
golang与PHP输出excel示例
2016/07/22 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
js获取url参数值的两种方式
2013/09/10 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
2015/06/01 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
Python中几种导入模块的方式总结
2017/04/27 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
django实现用户注册实例讲解
2019/10/30 Python
Python log模块logging记录打印用法解析
2020/01/20 Python
python 装饰器重要在哪
2021/02/14 Python
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
职称自我鉴定
2013/10/15 职场文书
课改先进个人汇报材料
2014/01/26 职场文书
业绩考核岗位职责
2014/02/01 职场文书
关于环保的建议书400字
2014/03/12 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
初中信息技术教学计划
2015/01/22 职场文书
领导参观欢迎词
2015/01/26 职场文书
护士先进个人总结
2015/02/13 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
入团申请书格式
2019/06/20 职场文书