在nestjs中typeorm中怎么进行联表查询

  1. 创建主表

//创建用户表

在entites实体表中

import {Entity,Column,PrimaryGeneratedColumn,CreateDateColumn, OneToMany, OneToOne, JoinColumn} from "typeorm"
//导入实体副表
import {Works} from "../../works/entities/works.entity"

@Entity()
export class My{
    //主键
    @PrimaryGeneratedColumn({type:"int",name:"id"})
    id:number

    @Column({type:"varchar",length:100})
    username:string


    @Column({type:"varchar",length:150})
    phone:string

    @Column({type:"varchar",length:150,select:false})
    password:string


    @CreateDateColumn({type:"timestamp"})
    createTime:Date

    @Column({type:"varchar",length:150,default:"1675924792718.jpg"})
    avator:string

    @Column({type:"varchar",length:100})
    class:string

    @Column({type:"varchar",length:100})
    team:string
    

    //创建一对多的关系works.my是副表 my: My字段,也就是下面所示

    // @ManyToOne((type)=>My,(my) => my.works,{eager:true,cascade:true})
        //@JoinColumn({name:"userId",referencedColumnName:"id"})
        //my: My
    @OneToMany(()=>Works,works=>works.my)
    works:Works[] //联表查询的时候会吧符合条件作品字段存入works中来展示

}

2、创建副本

//创建作品表

在entites实体表中

import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, ManyToMany, ManyToOne, JoinColumn, OneToOne, UpdateDateColumn, Generated, RelationId, JoinTable } from "typeorm"
//导入my实体表
import { My } from "../../my/entities/my.entity"

@Entity()

export class Works {
    //本表的主键
    @PrimaryGeneratedColumn({ type: "int" })
    id: number
    @Column({ type: "text" })
    content: string
    @Column({ type: "text" })
    image: string
    @Column({ type: "text" })
    video: string
    @Column({ type: "int" })
    type: number

    @CreateDateColumn({ type: "timestamp" })
    createTime: Date
    @Column({ type: "varchar", length: 200 })
    site: string
    @Column({ type: "int" })
    worksLimit: number
    @Column({ type: "int" })
    examine: number
    @Column({ type: "varchar", length: 50 })
    sort: string
    @Column({ type: "varchar", length: 200 })
    taskId: string
    @Column({ type: "varchar", length: 100 })
    teamId: string

    //外键id位外键的字段名
    @Column({ type: "int",foreignKeyConstraintName:"id"})
    userId: number
    
    //创建多对一的关系my.works是主表 works:Works字段
        //@OneToMany(()=>Works,works=>works.my)
        //works:Works[]
    @ManyToOne((type)=>My,(my) => my.works,{eager:true,cascade:true})
    //是要创建与外表连接的键的: name的话是本表的外键userId名, id的话是主表的主键名
    @JoinColumn({name:"userId",referencedColumnName:"id"})
    my: My


}

3、把实体都引进各自的模块中

1、用户的模块中使用


import { Module } from '@nestjs/common';
import { MyService } from './my.service';
import { MyController } from './my.controller';
import {TypeOrmModule} from "@nestjs/typeorm"
import {ConfigModule} from "../config/config.module"
import { JwtModule } from '@nestjs/jwt';

import { Works } from '../works/entities/works.entity';
import {My} from "./entities/my.entity"
@Module({
  imports:[TypeOrmModule.forFeature([My,Works]),ConfigModule,JwtModule.register({
    secret:"yaohf",
    signOptions:{
      expiresIn:"1h"
    }
  })],
  providers: [MyService],
  controllers: [MyController]
})
export class MyModule {}

2、works模块中使用

import { Module } from '@nestjs/common';
import { WorksController } from './works.controller';
import {WorksService} from "./works.service"
import { TypeOrmModule } from '@nestjs/typeorm';
import {ConfigModule} from "../config/config.module"

import { My } from '../my/entities/my.entity';
import {Works} from "./entities/works.entity"
@Module({
  imports:[TypeOrmModule.forFeature([Works,My]),ConfigModule],
  controllers: [WorksController],
  providers:[WorksService]
})
export class WorksModule {}

4、创建查询逻辑


import { Injectable, Inject } from '@nestjs/common';

import { Repository} from 'typeorm';
import { InjectRepository } from "@nestjs/typeorm"
import { worksInte } from "./interface/index"
import { utils } from '../config/config.utils';

import { My } from '../my/entities/my.entity';
import { Works } from "./entities/works.entity"

@Injectable()
export class WorksService {
    constructor(
        @InjectRepository(Works) private works: Repository<Works>,
        @InjectRepository(My) private my:Repository<My>,
        @Inject("utils") private utils:utils   
    ) { }






        //获取团队任务中的数据 user.works 就是主表中的定义的works:Works[]字段
        //Works是works实体对外暴露的名称,typeOrm底层框架会帮我们处理的,就是把它连两个表做一个连接处理而已
       async getTeamData(teamId:string){
        let res = await this.my.createQueryBuilder("user")
        .innerJoinAndSelect("user.works","Works",).where("Works.teamId=:teamId",{teamId})
        .getMany()

        if(res.length>0){
            res.forEach(item=>{
                item.createTime = this.utils.dateConversion( item.createTime) as unknown as                 Date
            })
            return {
                code:200,
                mes:"获取数据成功",
                data:res
            }
        }else{
            return {
                code:200,
                mes:"没有数据哟",
                data:[]
            }
        }
            
        // return {

        // }
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nestjs是一个基于Node.js的Web框架,它提供了一种现代化的、模块化的、可扩展的方式来构建服务端应用程序。typeorm是一个强大的ORM(对象关系映射)库,它可以将数据库的关系数据映射为对象,并且提供了一些便利的方法来操作这些对象。 nestjs整合typeorm可以帮助我们更方便地操作数据库,以下是nestjs整合typeorm的步骤: 1. 安装typeorm和nest-typeorm依赖: ``` npm install --save typeorm @nestjs/typeorm ``` 2. 在app.module.ts引入typeorm和nest-typeorm: ``` import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { User } from './user.entity'; // 引入实体类 @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: '123456', database: 'test', entities: [User], // 实体类列表 synchronize: true, }), TypeOrmModule.forFeature([User]), // 导入要用到的实体类 ], controllers: [AppController], providers: [AppService], }) export class AppModule {} ``` 3. 创建实体类: ``` import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @Column() age: number; @Column() email: string; } ``` 4. 在服务使用: ``` import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { User } from './user.entity'; @Injectable() export class UserService { constructor( @InjectRepository(User) private readonly userRepository: Repository<User>, ) {} async findAll(): Promise<User[]> { return await this.userRepository.find(); } async create(user: User): Promise<User> { return await this.userRepository.save(user); } async update(id: number, user: User): Promise<void> { await this.userRepository.update(id, user); } async delete(id: number): Promise<void> { await this.userRepository.delete(id); } } ``` 以上是nestjs整合typeorm的基本步骤,通过使用nestjs整合typeorm可以更方便地操作数据库,并且nestjs提供了很多其他功能,例如异常处理、日志等。如果您有任何问题或者需要更详细的介绍,请告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值