問題來源:
現有一張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(); } }
