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(); } }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM