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数组函数序列之in_array() - 查找数组中是否存在指定值
Nov 07 PHP
Yii PHP Framework实用入门教程(详细介绍)
Jun 18 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
May 04 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
实例简介PHP的一些高级面向对象编程的特性
Nov 27 PHP
php实现转换html格式为文本格式的方法
May 16 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
Sep 22 PHP
PHP符合PSR编程规范的实例分享
Dec 21 PHP
php实现留言板功能(代码详解)
Mar 28 PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 PHP
Laravel下生成验证码的类
Nov 15 PHP
php判断IP地址是否在多个IP段内
Aug 18 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
第五节 克隆 [5]
2006/10/09 PHP
BBS(php & mysql)完整版(六)
2006/10/09 PHP
php读取flash文件高宽帧数背景颜色的方法
2015/01/06 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
JS实现关键字搜索时的相关下拉字段效果
2014/08/05 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
javascript限制文本框输入值类型的方法
2015/05/07 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
利用JS轻松实现获取表单数据
2016/12/06 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
使用node.JS中的url模块解析URL信息
2020/02/06 Javascript
Python判断变量是否已经定义的方法
2014/08/18 Python
python中的多重继承实例讲解
2014/09/28 Python
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
TensorFlow实现创建分类器
2018/02/06 Python
python语言线程标准库threading.local解读总结
2019/11/10 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
python实现无边框进度条的实例代码
2020/12/30 Python
银行求职信个人范文
2013/12/16 职场文书
经济信息系毕业生自荐信范文
2014/03/15 职场文书
分公司负责人任命书
2014/06/04 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
2014年作风建设工作总结
2014/10/29 职场文书
加班费申请报告
2015/05/15 职场文书
一般纳税人申请报告
2015/05/18 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
导游词之桂林山水
2019/09/20 职场文书