【NestJs】使用MySQL关联查询

本文介绍了如何在NestJs中利用TypeORM进行数据库操作,包括一对一和一对多的查询。通过示例展示了在user.module.ts加载模块,user.controller.ts和user.service.ts中实现查询功能。此外,文章还提到了使用createQueryBuilder进行更复杂的SQL查询,并提供了一个查询日志结果分组的示例。
摘要由CSDN通过智能技术生成

上一篇文章介绍了NestJs使用MySQL创建多个实体,接下来讲到的则是实体创建完毕之后,开始进行查询。里面可能涉及到nestjs使用语法,要是不知道的小伙伴可以先行了解,也可以模仿写,后面我会继续出nestjs的教程。也欢迎大家一起学习探讨。

如果大家按照之前的步骤,那么接下来我们就可以直接在数据库中添加一些数据,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据增加完之后我们开始使用nesjs 实操查询功能。
首先我们应该在user.module.ts 加载对应的模块

import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { Logs } from '../logs/logs.entity';

@Module({
  imports: [TypeOrmModule.forFeature([User, Logs])],
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}

我使用的是TypeORM 自带的@nestjs/typeorm 查询方法

一对一查询

user.contorller.ts

import { Controller, Delete, Get, Patch, Post } from '@nestjs/common';
import { UserService } from './user.service';
import { ConfigService } from '@nestjs/config';
import { User } from './user.entity';

@Controller('user')
export class UserController {
  constructor(
    private userService: UserService,
    private configService: ConfigService,
  ) {}
  @Get('/profile')
  getUserProfile(): any {
    return this.userService.findProfile(2);
  }
}

user.service.ts

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>
  ) {}
  findProfile(id: number) {
    return this.userRepository.findOne({
      where: {
        id,
      },
      relations: {
        profile: true,
      },
    });
  }
}

在这里插入图片描述

一对多关系

还是在user.contorller.ts 增加一个接口名称

 @Get('/logs')
  getUserLogs(): any {
    return this.userService.findUserLogs(2);
  }

当然 我们 user.service.ts 的文件也应对应上

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
import { Logs } from '../logs/logs.entity';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User) private readonly userRepository: Repository<User>,
    @InjectRepository(Logs) private readonly logsRepository: Repository<Logs>,
  ) {}
  findProfile(id: number) {
    return this.userRepository.findOne({
      where: {
        id,
      },
      relations: {
        profile: true,
      },
    });
  }

  async findUserLogs(id: number) {
    const user = await this.findOne(id);
    return this.logsRepository.find({
      where: {
        user,
      },
      // relations: {
      //   user: true,
      // },
    });
  }

}

在这里插入图片描述

到目前我们学会是一对一,一对多的查询,当然学到这里也是很不错的了,不过,在企业中往往是不够用了,我们还得继续学习多个表并且对数据进行聚合。
接下来介绍的是TypeORM 中一个非常强大的查询方式。 官网链接
在这里插入图片描述

什么是QueryBuilder

QueryBuilderTypeORM 最强大的功能之一 ,它允许你使用优雅便捷的语法构建 SQL 查询,执行并获得自动转换的实体。

QueryBuilder的简单示例:

const firstUser = await connection
  .getRepository(User)
  .createQueryBuilder("user")
  .where("user.id = :id", { id: 1 })
  .getOne();

它将生成以下 SQL 查询:

SELECT
    user.id as userId,
    user.firstName as userFirstName,
    user.lastName as userLastName
FROM users user
WHERE user.id = 1

然后返回一个 User 实例:

User {
    id: 1,
    firstName: "Timber",
    lastName: "Saw"
}

如何创建和使用QueryBuilder

接来我们用当前的项目进行实战,在logs表中我们想查询有多少数据时请求成功,又有多少数据时请求失败的小案例。
在这里插入图片描述
回到我们的代码中
继续在user.contorller.ts 新增代码

@Get('/logsByGroup')
  async getLogsByGroup(): Promise<any> {
    const res = await this.userService.findLogsByGroup(2);
    return res;
  }

user.serveice.ts

findLogsByGroup(id: number) {
     // 原生sql
    // SELECT logs.result as rest, COUNT(logs.result) as count from logs, user WHERE user.id = logs.userId AND user.id = 2 GROUP BY logs.result;
	// 友好的使用sql语句
    // return this.logsRepository.query(
    //   'SELECT logs.result as rest, COUNT(logs.result) as count from logs, user WHERE user.id = logs.userId AND user.id = 2 GROUP BY logs.result',
    // );
    // 链式
    return (
      this.logsRepository
        .createQueryBuilder('logs')
        .select('logs.result', 'result')
        .addSelect('COUNT("logs.result")', 'count')
        .leftJoinAndSelect('logs.user', 'user')
        .where('user.id = :id', { id })
        .groupBy('logs.result')
        .orderBy('count', 'DESC')
        .addOrderBy('result', 'DESC')
        .offset(1)
        .limit(3)
        // .orderBy('result', 'DESC')
        .getRawMany()
    );
  }

在这里插入图片描述
很多细心的同学看到了我们把用户的密码也暴露出来了,这边我先留一个坑,大家可以先想想怎么处理。

好了 文档到这里 已经介绍完 NestJs使用MySQL关联查询,一共三篇文章

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的引用内容,可以看出nestjs是一个基于Node.js的后端框架,可以使用它来构建高效且可扩展的服务器端应用程序。在nestjs使用mysql数据库可以通过TypeORM来实现,TypeORM是一个ORM框架,可以将对象映射到数据库中的表中。下面是在nestjs使用TypeORM自动建表的步骤: 1. 安装TypeORM和mysql驱动程序 ```shell npm install --save @nestjs/typeorm typeorm mysql ``` 2. 在app.module.ts中导入TypeOrmModule和ConfigModule ```typescript import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ConfigModule } from '@nestjs/config'; @Module({ imports: [ ConfigModule.forRoot(), TypeOrmModule.forRoot({ type: 'mysql', host: process.env.DB_HOST, port: parseInt(process.env.DB_PORT), username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_DATABASE, autoLoadEntities: true, synchronize: true, }), ], }) export class AppModule {} ``` 3. 创建实体类 ```typescript import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @Column() age: number; } ``` 4. 在服务中使用实体类 ```typescript 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); } } ``` 5. 运行应用程序 ```shell npm run start ``` 这样,当应用程序启动时,TypeORM将自动创建User实体对应的表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘴巴嘟嘟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值