TypeORM 無關(guān)聯(lián)關(guān)系的mysql多表連接查詢

??TypeORM 官方給的文檔中姜胖,多表查詢時(shí)使用的是通過實(shí)體關(guān)系進(jìn)行l(wèi)eftjoin查詢誉帅,我們知道TypeORM實(shí)體關(guān)系實(shí)際上是通過mysql的外鍵實(shí)現(xiàn)的。在實(shí)際開發(fā)中右莱,外鍵因?yàn)橛兄T多限制不被推薦使用蚜锨,大部分的都是無關(guān)系的表連接。經(jīng)過幾天的查找資料和摸索慢蜓,找到了兩種查詢的方法亚再,總結(jié)一下,如果大家有其他好的方法晨抡,歡迎留言討論氛悬。

定義實(shí)體類

User 實(shí)體
import { Entity, Column, PrimaryColumn } from 'typeorm';
@Entity()
export class User {
  @PrimaryColumn()
  id: string;

  @Column()
  nickname: string;

  @Column()
  gender: number;

  @Column()
  avatarUrl: string;

  @Column()
  language: string;

  @Column()
  country: string;

  @Column()
  province: string;

  @Column()
  city: string;
}
Role 實(shí)體類
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Role {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  roleId: number;

  @Column()
  userId: string;
}
Role_dic 實(shí)體類
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Role_dic {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  roleId: number;

  @Column()
  roleName: string;
}
表關(guān)系
user.id = role.userId  role.roleId = role_dic.roleId

User service查詢的兩種方式

方法一
    // 查詢語句
    let queryBuilder = this.connection.createQueryBuilder(User, 'user');
    const user = await queryBuilder
    .leftJoinAndSelect(Role, 'role', 'role.userId = user.id')
    .leftJoinAndSelect(Role_dic, 'role_dic', 'role_dic.roleId = role.roleId')
    .where("user.id = :id", { id: userId })
    .select(`
      user.id as id,
      user.nickname as nickname,
      user.gender as gender,
      user.avatarUrl as avatarUrl,
      user.language as language,
      user.country as country,
      user.province as province,
      user.city as city,
      role.roleId as roleId,
      role_dic.roleName as roleName
    `)
    .getRawOne();

// 返回結(jié)果
{
    "id": "1630404672291",
    "nickname": "xiaoditian",
    "gender": 1,
    "avatarUrl": "mytouxiang",
    "language": "cn",
    "country": "china",
    "province": "henan",
    "city": "zhengzhou",
    "roleId": 1,
    "roleName": "管理員"
}

??這種方法使用getRawOne獲取到sql查詢后的原始數(shù)據(jù)则剃,因?yàn)門ypeORM會(huì)用別名,所以這里用select對(duì)字段進(jìn)行了重命名如捅,這個(gè)寫法需要對(duì)每個(gè)需要的字段名進(jìn)行重命名棍现,否則返回的字段名稱會(huì)帶上表名。

方法二
//查詢語句
let queryBuilder = this.connection.createQueryBuilder(User, 'user');
const user = await queryBuilder
      .leftJoinAndMapOne('user.role', Role, 'role', 'role.userId = user.id')
      .leftJoinAndMapOne('role.roleDic', Role_dic, 'role_dic', 'role_dic.roleId = role.roleId')
      .where("user.id = :id", { id: userId })
      .getOne();
//返回結(jié)果

{
    "id": "1630404672291",
    "nickname": "xiaoditian",
    "gender": 1,
    "avatarUrl": "mytouxiang",
    "language": "cn",
    "country": "china",
    "province": "henan",
    "city": "zhengzhou",
    "role": {
        "id": 1,
        "roleId": 1,
        "userId": "1630404672291",
        "roleDic": {
            "id": 1,
            "roleId": 1,
            "roleName": "管理員"
        }
    }
}

??第二種方法使用leftJoinAndMapOne作字段映射镜遣,如果一對(duì)多可以使用leftJoinAndMapMany己肮。這樣就不用挨個(gè)對(duì)字段重命名,但是可能存在嵌套較深的問題悲关。

總結(jié)

??以上是常用的兩種表連接的方法谎僻,每個(gè)都有其優(yōu)缺點(diǎn),可以根據(jù)情況選擇使用寓辱。兩外附上這兩種方法的出處:
1艘绍、https://juejin.cn/post/6916483483095449608
2、https://www.cnblogs.com/zzk96/p/11397223.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末讶舰,一起剝皮案震驚了整個(gè)濱河市鞍盗,隨后出現(xiàn)的幾起案子需了,更是在濱河造成了極大的恐慌跳昼,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肋乍,死亡現(xiàn)場(chǎng)離奇詭異鹅颊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)墓造,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門堪伍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人觅闽,你說我怎么就攤上這事帝雇。” “怎么了蛉拙?”我有些...
    開封第一講書人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵尸闸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我孕锄,道長(zhǎng)吮廉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任畸肆,我火速辦了婚禮宦芦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轴脐。我一直安慰自己调卑,他們只是感情好抡砂,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恬涧,像睡著了一般舀患。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上气破,一...
    開封第一講書人閱讀 52,166評(píng)論 1 308
  • 那天聊浅,我揣著相機(jī)與錄音,去河邊找鬼现使。 笑死低匙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碳锈。 我是一名探鬼主播顽冶,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼售碳!你這毒婦竟也來了强重?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤贸人,失蹤者是張志新(化名)和其女友劉穎间景,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艺智,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倘要,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了十拣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片封拧。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖夭问,靈堂內(nèi)的尸體忽然破棺而出泽西,到底是詐尸還是另有隱情,我是刑警寧澤缰趋,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布捧杉,位于F島的核電站,受9級(jí)特大地震影響埠胖,放射性物質(zhì)發(fā)生泄漏糠溜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一直撤、第九天 我趴在偏房一處隱蔽的房頂上張望非竿。 院中可真熱鬧,春花似錦谋竖、人聲如沸红柱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锤悄。三九已至韧骗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間零聚,已是汗流浹背袍暴。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隶症,地道東北人政模。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蚂会,于是被迫代替她去往敵國和親淋样。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容