【NestJs】使用MySQL关联查询

news2024/11/27 8:47:12

上一篇文章介绍了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关联查询,一共三篇文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC的基本使用-------基本注解RequestMapping、基本数据类型绑定、参数绑定、POJO类型绑定

SpringMVC的三层架构和MVC SpringMVC简介 三层架构概述&#xff1a; 一种是 C/S 架构&#xff0c;也就是客户端/服务器&#xff0c;另一种是 B/S 架构&#xff0c;也就是浏览器服务器。在 JavaEE 开发中&#xff0c;几乎全都是基于 B/S 架构的开发。那么在 B/S 架构中&#…

时间序列信号阈值降噪方法,有什么可以创新的地方吗?

可以换个空间&#xff0c;从图域的角度进行分析&#xff0c;比如图傅里叶变换&#xff0c;图小波变换等图时频分析方法。图小波阈值降噪的基本思想是通过将时间序列信号转换成路图信号&#xff0c;再利用图小波变换分解成尺度函数系数和一系列对应不同尺度的谱图小波系数&#…

VAE 理论推导及代码实现

VAE 理论推导及代码实现 熵、交叉熵、KL 散度的概念 熵&#xff08;Entropy) 假设 p (x&#xff09;是一个分布函数&#xff0c;满足在 x 上的积分为 1&#xff0c;那么 p(x)p(x)p(x)的熵定义为 H(p(x))H (p (x))H(p(x))&#xff0c;这里我们简写为 H(p)H(p)H(p) H(p)∫p(x)…

移动硬盘文件或目录损坏且无法读取,这样做就对了!

案例&#xff1a;移动硬盘文件或目录损坏且无法读取怎么办 【我的移动硬盘插入电脑后突然就显示文件损坏&#xff0c;遇到这种情况我应该怎么处理呀&#xff1f;感谢回答&#xff01;】 移动硬盘是一种方便携带和存储数据的设备&#xff0c;然而&#xff0c;有时候可能会遇到…

UE中的channel

当我们需要处理碰撞矩阵&#xff0c;或者调用接口投射射线进行检测等&#xff0c;为了区分哪些对象可以被射线检测到&#xff0c;哪些对象忽略&#xff0c;就需要用到channel。 1.Channel 简介 在UE5中&#xff0c;一个对象的channel可以在Physics下查看&#xff1a; 设置成…

如何确保采购过程中的产品质量

在企业采购过程中&#xff0c;确保采购的产品质量是至关重要的。采购的质量直接关系到企业的生产和销售质量&#xff0c;影响企业的形象和利润。为了确保采购过程中的质量&#xff0c;企业需要采取一些措施来保证采购物料和商品的质量&#xff0c;以下是一些有效的方法&#xf…

Linux学习-----Chapter nine

使用 ssh 服务管理远程主机9.1 配置网络服务9.1.1 配置网卡参数9.1.2 创建网络会话9.1.3 绑定两块网卡1、创建一个bond网卡2、向bond0设备添加从属网卡3、配置bond0设备的网络信息4、启动它9.2 远程控制服务9.2.1 配置sshd服务9.2.2 安全密钥验证9.2.3 远程传输命令9.3 不间断会…

日撸 Java 三百行day25-26

文章目录说明day25 二叉树深度遍历的栈实现 (中序)1.具有通用性的对象栈2.栈实现中序遍历2.1 思路2.2 代码day26 二叉树深度遍历的栈实现 (前序和后序)1.前序遍历2.后序遍历说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-…

Redis第二十八讲 Redis集群脑裂数据丢失问题与集群是否完整才能对外提供服务

集群脑裂数据丢失问题 所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求。而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。而且,严重的话,脑裂会进一步导致数据丢失。 redis的集群…

银行数字化转型导师坚鹏:银行业同业竞争策略分析

《银行业同业竞争策略分析》 —数字化背景下银行转型发展创新思维 课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚国内领先银行的业务发展现状&#xff1f; 不清楚如何制定竞争策略&#xff1f; 不知道其他银行转型的成功做法&…

Matplotlib学习挑战第六关--散点图、柱形图、饼图

1、Matplotlib 散点图 我们可以使用 pyplot 中的 scatter() 方法来绘制散点图。 scatter() 方法语法格式如下&#xff1a; matplotlib.pyplot.scatter(x, y, sNone, cNone, markerNone, cmapNone,normNone, vminNone, vmaxNone, alphaNone, linewidthsNone, *, edgecolorsNo…

【RabbitMQ】RabbbitMQ的六种工作模式以及代码实现

目录 一、交换机类型 二、简单模式 1、介绍 2、代码实现 三、Work Queues工作队列模式 1、介绍 2、代码实现 四、Pub/Sub订阅模式 1、介绍 2、代码实现 五、Routing路由模式 1、介绍 2、代码实现 六、Topics通配符模式 1、介绍 2、代码实现 一、交换机类型 在…

uniapp开发,打包成H5部署到服务器

前端使用uniapp开发项目完成后&#xff0c;需要将页面打包&#xff0c;生成H5的静态文件&#xff0c;部署在服务器上。 这样通过服务器链接地址&#xff0c;直接可以在手机上点开来访问。 打包全步骤如下&#xff1a; 1、修改config.js内的请求地址 需要后台部署到测试服务器上…

项目进度管理软件的应用可以解决哪些问题

项目管理工具够满足了项目经理对项目资源&#xff1a;时间、人员和文档的管理&#xff0c;同时也提高了项目的可视化和促进了团队的协作。 项目进度管理要求在规定的时间内&#xff0c;通过合理的进度计划&#xff0c;在计划执行过程中&#xff0c;要检查实际进度是否按计划要…

PasteSpider之项目环境-同步过滤-键值配置介绍

项目环境 在菜单项目信息项目环境 中&#xff0c;在PasteSpider中项目->服务->环境&#xff0c;也就是服务是不能运行的&#xff0c;得绑定环境&#xff0c;比如开发环境&#xff0c;测试环境。通过这个概念你可以实现不同得人部署不同的环境&#xff0c;他们之间公用同版…

ChatGPT之父:未训练GPT-5

GPT等大型语言模型带动的芯片需求飙升趋势依然没有平息的迹象&#xff0c;英伟达的最新版旗舰AI芯片H100近日在网上的售价已经被炒到4万多美金&#xff0c;反映了科技行业对训练和部署人工智能软件的需求仍未被满足。 一、商业圈 1.马斯克成立新AI公司硬刚OpenAI 当地时间4月…

大屏开发需要知道哪些知识

大屏 大屏是什么呢&#xff1f;再我前几年刚接触这个词得时候很新颖&#xff0c;全名叫态势感知大屏&#xff0c;大屏得特点是炫酷、好看&#xff0c;给用户满满得科技感。 听一位前辈说当年再招标会上&#xff0c;再都用exel、word做界面图表文档得时候&#xff0c;有一家公司…

使用MyBatis实现条件查询

文章目录一&#xff0c;查询需求二&#xff0c;打开MyBatisDemo项目三&#xff0c;对学生表实现条件查询&#xff08;一&#xff09;创建学生映射器配置文件&#xff08;二&#xff09;在MyBatis配置文件里注册学生映射器配置文件&#xff08;三&#xff09;创建学生映射器接口…

kaggle数据集下载

一、首先需要安装kaggle winR→cmd→pip install kaggle 问题&#xff1a;安装到哪来&#xff1f;都说在c盘。可是我找不到&#xff0c;可能因为之前担心c负荷更改路径了&#xff0c;再安装一下发现已经安装成功&#xff0c;且给出了安装路径。 二、注册 (1387条消息) 最新k…

VS Code 最新 Java 编码体验更新

大家好&#xff0c;欢迎来到我们的三月更新&#xff01;我们将为您带来一系列基础编码体验的改进&#xff0c;例如运行 Java 程序的更流畅体验、AWT 项目相关的代码补全优化以及更好的 Spring Boot 项目与 Azure 的集成&#xff0c;让我们开始吧&#xff01; 运行 Java 程序的用…