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怎么关 百度输入法全感官皮肤关闭  网站建设要注意的标准 促进网站用户好感度!