TP6踩坑 -- 关联查询

标签: PHP  php

废话不多说。先看数据库结构:

user表(user):

队伍表(team):

加粉表(fans):

需求:查询同一活动中,每个参与活动的用户的加粉数统计,并排名。如图。

根据需求我们可以很容易在fans模型类中写出基本的sql语句:

$list = self::fieldRaw('uid,team_id,sum(fans_num) as '.$funs_num) -> where($where) -> group('uid') -> order($funs_num,$order) -> select() -> toArray();

//返回值:
     [
        {
            "uid": 1571,
            "team_id": 15,
            "funs_sum": "201"
        },
        {
            "uid": 1647,
            "team_id": 15,
            "funs_sum": "100"
        },
        {
            "uid": 1991,
            "team_id": 15,
            "funs_sum": "100"
        }
    ]

现在只需要完善team_id与uid的具体信息就可以了。根据表结构,我们可以看出来,对于加粉表来说,与user表是多对一关系,与team表也是多对一关系。

那么我们可以很容易得出fans模型类中的关联关系

根据TP6文档的关联查询语法,我们可以获取以下语句:

self::with(['user','team']) -> fieldRaw('uid,team_id,sum(fans_num) as '.$funs_num) -> where($where)  -> group('uid') -> order($funs_num,$order) -> select() -> toArray();

//返回值:
[
        {
            "uid": 1571,
            "team_id": 15,
            "funs_sum": "201",
            "user": {
                "staff_id": 1571,
                "salt": "3792",
                "mobile": "13422293015",
                "real_name": "陈苑红+老板电器",
                "store_name": "海珠合生广场店",
                "store_id": 9,
                "department": "海珠合生广场店厂家促销员",
                "routine_openid": "o9Bsa0f7iVAfrEX5GkqEtlWRJDJA",
                "unionid": "oyqtT0WTbEJAMxZeXmN52EUTLgCA",
                "wechat_name": "陈苑红",
                "wechat_headicon": "https://wx.qlogo.cn/mmopen/vi_32/Slf77Ktx7RsYaniaWG9H3k9wIjGWgVmJXSxeBo3ibh0zia9xBialn0U11rHmsRBJBWj9YQCL6CiciagyG7wOHSJzWC0w/132",
                "form": 0,
                "status": 0,
                "update_time": null,
                "add_time": 1571315687,
                "user_id": 0,
                "crm_user_id": 0,
                "crm_sync_update_day": 0,
                "qr_url": null,
                "occupation": "",
                "experience": "",
                "wx": "",
                "position_id": 0,
                "occupation_is_run": 0
            },
            "team": {
                "id": 15,
                "activity_id": 10,
                "team_name": "",
                "shop_id": 5,
                "area": "",
                "logo": "5c7fa1d7ac0ad.png",
                "add_time": 1604731190,
                "update_time": null
            }
        },

可见,把user的所有字段都带出来了,我们只需要user真实名字,跟队伍的真实名字,根据文档,我们得出以下语句:

self::with(['user'=>function(Query $query){
            $query -> field('real_name');
        },'team'=> function(Query $query){
            $query -> field('team_name');
        }]) -> fieldRaw('uid,team_id,sum(fans_num) as '.$funs_num) -> where($where)  -> group('uid') -> order($funs_num,$order) -> select() -> toArray();

//返回值:
[
        {
            "uid": 1571,
            "team_id": 15,
            "funs_sum": "201",
            "user": null,
            "team": null
        },
        {
            "uid": 1647,
            "team_id": 15,
            "funs_sum": "100",
            "user": null,
            "team": null
        },
        {
            "uid": 1991,
            "team_id": 15,
            "funs_sum": "100",
            "user": null,
            "team": null
        }
    ]

返回值出乎了我们的预料,user与team都为null,也就是查询不到了!!!文档里面并没有说明这种情况。

翻来覆去弄了好久,最后发现,筛选字段中必须包含所有的关联主键,并且外层field中必须包含关联外键,否则查询不到相应的数据。

返回值:
    [
        {
            "uid": 1571,
            "team_id": 15,
            "funs_sum": "201",
            "user": {
                "staff_id": 1571,
                "real_name": "陈苑红+老板电器"
            },
            "team": {
                "id": 15,
                "team_name": ""
            }
        },
        {
            "uid": 1647,
            "team_id": 15,
            "funs_sum": "100",
            "user": {
                "staff_id": 1647,
                "real_name": "苏晓凤"
            },
            "team": {
                "id": 15,
                "team_name": ""
            }
        },
        {
            "uid": 1991,
            "team_id": 15,
            "funs_sum": "100",
            "user": {
                "staff_id": 1991,
                "real_name": "温乐"
            },
            "team": {
                "id": 15,
                "team_name": ""
            }
        }
    ]

终于我们查询出了想要的数据。这里关联查询field字段中一定要包含各表的主键,否则会查询不到数据。

版权声明:本文为baidu_36095053原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_36095053/article/details/109600387

智能推荐

train_test_split切分数据集工具

顾名思义,这是一个切分训练集与测试集的工具   如果我们不使用,而是手动进行划分,要么进行简单的操作——划去前80%为训练集,后20%为测试集,这样会带来很多的问题,因为这样做,我们切出来的会让训练集和测试集的分布很不一致,我们可以看一下简单粗暴方法切出来的分布图: 红色的训练集,蓝色是测试集(点击图片放大可以看得很清楚,直接看博客好像图片模糊)   然...

shell编程第一节 和shell

shell编程看的博客感觉写的挺好的:http://www.cnblogs.com/dongying/p/6262935.html 以及  https://www.cnblogs.com/clsn/p/8028337.html#auto_id_0 简单总结:shell编程就是对一堆Linux命令的逻辑化处理。 chmod +x hello_world.sh ./hello_world.s...

微信开发:js sdk 分享(java)

今天记录一下微信jssdk 的分享给朋友的功能,获取config接口注入。 1.需要绑定域名(注意:设置js安全域名的时候,需要设置微信ip白名单,ip白名单新出来的,非白名单内的ip无法获取access_token 更无法获取jsapi) 在设置js 安全域名在 设置–>公众号设置–>功能设置里边 appid appSercret 在开发–>...

js--HTML美术馆

前言 因为之前库房合作的时候交给我一个任务,就是在点击某一项物品的时候显示出几张相印的小图片,然后点击小图片之后显示出一张大图片,因为当时还没有接触JavaScript,所以这方面的知识不是很了解,一直拖着,大概有两天吧,是在是解决不了,于是将这个任务交给了老付和建华,今天在学习JavaScript的时候突然之后就看到了有这么一项功能,于是就有感而发。 内容 首先向大家展示代码。 这部分是HTML...

Jenkins持续集成环境部署(入门篇)

为什么要持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。 价值: 1、减少风险 一天中进行多次的集成,并做了相应的测试,有利于检查缺陷,了解软件的健康状况,减少假定。 2、减少重复过程 节省时间、费用和工作量,通过自动化的持...

猜你喜欢

linux 下rabbitmq的安装以及设置远程用户访问

安装过程中会有提示,一路输入“y”即可。 完成后安装RabbitMQ: 3.自己建个文件夹 进行下载安装也可  直接执行也可 先下载rpm: 完成后启动服务: 可以查看服务状态: 这里可以看到log文件的位置,转到文件位置,打开文件: 这里显示的是没有找到配置文件,我们可以自己创建这个文件 编辑内容如下: 这里的意思是开放使用,rabbitmq默认创建的用户gue...

Java工程师成长修炼手册:01--Java基础特性和字符串

一.三大特性 1.封装 封装,把对象的属性封装起来(使用private修饰符),不被外部程序直接随意调用或修改成员变量。只能通过对象使用public修饰符的set 和 get 方法,来设置和获取成员变量的值。也可以把只在本类内部使用的方法使用 private。另外,还可以封装,隐藏一些方法,需要用的时候,就调用这些方法。这些就是封装。 封装的优点 良好的封装能够减少耦合,可以独立地开发、优化和修改...

android手机传感器总结

  传感器的分类 动作传感器 加速度传感器 重力传感器 陀螺仪 位置传感器 方向传感器 磁力传感器 环境传感器 温度传感器 压力传感器 亮度传感器 传感器的使用 1.获取SensorManager对象 2.执行SensorManager对象的getdefaultSensor()方法获取Sensor对象 3.获取Sensor对象的各种属性 获取安卓手机中所有传感器  输出结果 传...

Spring实战学习笔记

Spring之旅 依赖注入 我们想让骑士去营救少女 这样写会造成耦合度太高,如果让骑士去杀龙或者其他探险就无能为力了,正确的做法是将骑士的任务作为参数传递给骑士,如下面的BraveKnight类 接着实现具体的探险 接着用一个knight.xml让框架帮我们实现BraveKnight类,并且初始化其任务 开始探险 应用切面 系统由许多不同的组件组成,每个组件除了自身核心的功能外,还承担着额外的职责...

从4个月到7天,Netflix开源Python框架Metaflow有何提升性能的魔法?

作者 | Rupert Thomas 译者 | 凯隐 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100)   【导语】Metaflow 是由 Netflix 开发,用在数据科学领域的 Python框架,于 2019 年 12 月正式对外开源。据介绍,Metaflow 解决了数据科学家在可扩展性和版本控制方面面临的一些挑战,通过有向图中的一系列步骤来构建处理流水线。M...