• thinkjs——两表联查


    问题来源:

    现有一张texture以及一张tradename表,两者的联系是texture表中有一字段名为tid对应tradename表中的id,而tradename表中却有一字段type,要求根据tradename表中的type值为texture表分类显示。

    解决方案:

    1.欠打的麻烦又慢的solution

    刚拿到手时,脑中想的第一种解决方案就是在查出texture表中现有的数据后,再取所有的tid集合,用in在texture表中用in查询,得到tradename表中的所有信息,然后再继续各种操作……

    直到写到最后,才意识到自己的这种写法越写越麻烦,进而才想到或许自己的思考方向跑偏了,于是再翻看thinkjs官网中的model的介绍时,才看见有一种比较简洁的方法。

    2.官方提供solution

    在thinkjs官网中model本身提供了一种多表联合查询的方法:join,而这种方法就类似于我们之前用过mysql的join,只是这次自己又踩坑了:

    踩坑,坑,坑:

    两表联查的时候,会存在多个重复的字段名,比如 id,name……比如你要按id进行排序的话,就不能简单的写着.order('id desc'),这样写的话程序肯定就抛出异常:'Column 'id' in field is ambiguous',知道这是什么吗?

    原因就在于这里的id指代不明确,因为两张表中都存在id,因此在遇到相同字段名的时候,切记要给另外一张表中同名的字段名重新命名,这样才可以完美将坑踩在脚下。 

    下面是正确的完整代码:

    /**
     * authon:xxx
     * create:2017-02-10
     * update:2017-02-10
     * desc:xxxx
     */
    'use strict';
    /**
     * model
     */
    export default class extends think.model.base {
        /**
         *  获取列表方法
         * @param obj
         * @returns {*}
         */
        getList(obj) {
            let whereObj = {'type': obj.type};
            if (obj.stid && obj.stid != -99) {
                whereObj['texture.stid'] = obj.stid;
            }
            if (obj.tid && obj.tid != -99) {
                whereObj['texture.tid'] = obj.tid;
            }
            if (obj.sid && obj.sid != -99) {
                whereObj['texture.sid'] = obj.sid;
            }
            return this.join({ table: 'tradename',  join: 'left', on: ['tid', 'id'] }).where(whereObj).order('texture.id DESC').field("tradename.id as tnid,texture.*").page(obj.page, obj.rows).countSelect();
        }
    }
  • 相关阅读:
    MFC的奇异non-modality模态对话框
    用于对话框,窗体视图,对话框和属性类型的布局管理器
    在。net中定制OpenFileDialog
    NFS的使用
    snmp-get
    zabbix-trap
    部署
    /etc/rc.local
    gj的交换机在升级了ios之后最新数据不刷新,
    计算型监控项
  • 原文地址:https://www.cnblogs.com/zhengyeye/p/6395019.html
Copyright © 2020-2023  润新知