问题来源:

现有一张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();
}
}

thinkjs——两表联查的更多相关文章

  1. asp.net mvc 三层加EF两表联查

    首先打开vs软件新建项目创建web中的mvc项目再右击解决方案创建类库项目分别创建DAL层和BLL层再把DAL层和BLL层的类重命名在mvc项目中的Models文件夹创建model类在DAL创建ADO ...

  2. yii2.0AR两表联查

    首先,建两个关联表. 表一 -- Table structure for article -- ---------------------------- DROP TABLE IF EXISTS `a ...

  3. dos命令 创建数据库,建表,两表联查,三表联查(mysql---第一篇)

    首先打开mysql的控制台,输入密码进行登录  (ps:本文的mysql控制台,是运用的php的集成环境(phpstudy),点击运行,找到mysql命令行,直接打开就可以了) 登陆成功后,就可以进行 ...

  4. thinkphp两表联查并且分页

    ThinkPHP中关联查询(即多表联合查询)可以使用 table() 方法或和join方法,具体使用如下例所示: 1.原生查询示例: $Model = new Model(); $sql = 'sel ...

  5. iwebshop两表联查

    $tb_goods = new IQuery('goods as g'); $tb_goods->join='left join miao as m on m.goods_id=g.id'; $ ...

  6. Group by 两表联查取另一表与之关联数据的总数

    使用group by 需要查询的字段 必须要放在group by 后面 SELECT U.UserLotterySn,count(W.Userlotterysn) as WinCount,U.Acti ...

  7. SQLServer多表联查,多表分页查询

    多表联查: select p.*,s.Sheng , i.Shifrom  [dbo].[ProductRecordInfo]   --表名 p left join [ShengInfo] s on ...

  8. MySQL多表联查之ThinkPHP中的实现

    创建两个表如图: sp_user表: sp_dept表: 目的:通过sp_user的dept_id查询所属部门即sp_dept中的name. 原生sq方法一:select t1.*,t2.name a ...

  9. Oracle中如何实现Mysql的两表关联update操作

    在看<MySQL 5.1参考手册>的时候,发现MySQL提供了一种两表关联update操作.原文如下: UPDATE items,month SET items.price=month.p ...

随机推荐

  1. python学习笔记(16)--django的安装

    说明: 1. 直接在cmd输入: pip install Django==1.10.6前提是安装了python,pip并添加了环境变量 2. http://www.lfd.uci.edu/~gohlk ...

  2. javascript-删除节点

    任务目的: 每点击一下按钮删除一个标签. 掌握到了: 这里是主要学习到了parentNote以及removeChild两个DOM属性. parentNote:parent英译为父亲,Note英译为节点 ...

  3. PHP中Array的hash函数实现

    PHP中使用最多的非Array莫属了,那Array是如何实现的? 在PHP内部Array通过一个hashtable来实现,其中使用链接法解决hash冲突的问题,这样最坏情况下,查找Array元素的复杂 ...

  4. 【Unity笔记】使用协程(Coroutine)异步加载场景

    using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; using System; public ...

  5. C语言 · 五次方数

    算法提高 五次方数   时间限制:1.0s   内存限制:256.0MB      问题描述 对一个数十进制表示时的每一位数字乘五次方再求和,会得到一个数的五次方数 例如:1024的五次方数为1+0+ ...

  6. Android——列表视图 ListView(三)BaseAdapter

    activity_activitybase.xml <?xml version="1.0" encoding="utf-8"?> <ListV ...

  7. (转)windows环境vue+webpack项目搭建

    首先,vue.js是一种前端框架,一般利用vue创建项目是要搭配webpack项目构建工具的,而webpack在执行打包压缩的时候是依赖node.js的环境的,所以,要进行vue项目的开发,我们首先要 ...

  8. HTTP API 设计指南(结尾)

    前言 这篇指南介绍描述了 HTTP+JSON API 的一种设计模式,最初摘录整理自 Heroku 平台的 API 设计指引 Heroku 平台 API 指引. 这篇指南除了详细介绍现有的 API 外 ...

  9. C#分割文件内容

    static void ReadData(string sourcePath, string targetDirectory) { FileStream fs = new FileStream(sou ...

  10. 30个实用的jQuery选项卡/导航教程推荐

    很多网站设计中都使用了选项卡(tabs),在制作选项卡时应用jQuery能够实现很多炫酷的过渡和动画效果.本文为你介绍30个实用的jQuery选项卡教程,希望对你有帮助. 1. Animated Ta ...