Laravel关联模型中has和with区别(详细介绍)
发布时间 - 2018-10-18 00:00:00 点击率:次本篇文章给大家带来的内容是关于laravel关联模型中has和with区别(详细介绍),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
首先看代码:
$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
# php
# sql
# NULL
# 数据结构
# 为空
# 第二条
# 都是
# 是在
# 会有
# 放在
# 就不
# 对你
# 有一定
# 这两个
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Python结构化数据采集_字段抽取解析【教程】
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
Python正则表达式进阶教程_复杂匹配与分组替换解析
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
北京企业网站设计制作公司,北京铁路集团官方网站?
Laravel如何使用Sanctum进行API认证?(SPA实战)
如何确保FTP站点访问权限与数据传输安全?
如何快速查询网站的真实建站时间?
网站制作软件有哪些,制图软件有哪些?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
香港服务器租用每月最低只需15元?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
如何在腾讯云服务器上快速搭建个人网站?
图册素材网站设计制作软件,图册的导出方式有几种?
详解Android图表 MPAndroidChart折线图
创业网站制作流程,创业网站可靠吗?
如何在IIS中新建站点并解决端口绑定冲突?
Laravel如何使用Livewire构建动态组件?(入门代码)
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
原生JS获取元素集合的子元素宽度实例
Laravel中的withCount方法怎么高效统计关联模型数量
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
如何在云服务器上快速搭建个人网站?
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
js实现获取鼠标当前的位置
Laravel如何使用模型观察者?(Observer代码示例)
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
在centOS 7安装mysql 5.7的详细教程
零基础网站服务器架设实战:轻量应用与域名解析配置指南
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
公司网站制作价格怎么算,公司办个官网需要多少钱?
如何获取上海专业网站定制建站电话?
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
微信小程序 require机制详解及实例代码
如何在万网自助建站平台快速创建网站?
JavaScript常见的五种数组去重的方式
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
Swift开发中switch语句值绑定模式
浅谈javascript alert和confirm的美化
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
怎样使用JSON进行数据交换_它有什么限制
网站制作价目表怎么做,珍爱网婚介费用多少?
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
网站建设要注意的标准 促进网站用户好感度!


/ 更多查询省略...