《Nest系列 - 4. 听说人人都会CRUD,可是我还不会怎么办???-《4.3结合前端使用实现多表联合查询》

news2024/11/23 9:30:39

🍑 联合查询

在我们前端来说,会抽离一些公用组件。不会把重复的组件或者所有代码都放在一个文件夹下。对于后端来说,也是一样的, 我们不会把所有数据都放在一张表里,我们回进行分表,根据一些关联关系,进行联合查询
这样可以消除冗余,并且可以提高查询的效率

🥑 效果展示

在这里插入图片描述

tags 表中也多了对应的数据

image.png

🧐 分析

  • 用户对于标签的关系 一个用户可以拥有多个标签(一对多)
  • 多个标签对应一个用户 (多对一)

image.png

🤔 用户表和标签表怎么做关联

操作数据库,使用typeorm,里面有两个装饰器OneToManyManyToOne 这两个装饰器就是做数据库关联关系

  • tags.entity.ts

import { Column, Entity, PrimaryGeneratedColumn, BeforeInsert, CreateDateColumn, Generated, OneToOne, JoinColumn, ManyToOne } from 'typeorm'
import { User } from './user.entity'
@Entity()
export class Tags {
    // 递增主键
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    tags:string
    
 // 多对一,回调函数,帮助Tags 表 和 User 表建立关联。第一个参数是User实体类, 第二个参数(回调函数)是关联的字段
    @ManyToOne(()=>User,(user)=>user.tags)
    @JoinColumn()
    user:User
} 
  • user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn, OneToMany } from 'typeorm';
import { Tags } from './tags.entity';

// 表名
@Entity({ name: 'users' })
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 30, nullable: true, comment: 'user name' })
  name: string;

  @Column({ nullable: true, comment: 'user age' })
  age: number;

  @CreateDateColumn({ name: 'created_at', type: 'datetime', comment: 'created time' })
  createdAt: Date;

  @UpdateDateColumn({ name: 'updated_at', type: 'datetime', comment: 'updated time' })
  updatedAt: Date;
  // 用户对标签事一对多关系,帮助User 表和 Tag 表建立关联。第一个参数事Tags 实体类,第二个参数(回调函数) 是关联的字段
  @OneToMany(() => Tags, (tags) => tags.user)
  tags:Tags[]
  
}

👱 前端部分逻辑

其实前端并不关心你是怎么关联的,我只调用相应的接口,传递相应的字段,后端做处理就行

//添加tag 接口
export const addTags = (data) => axios.post(`/user/add/tags`, data).then((res) => res.data)
// 模版显示
<el-dialog v-model="isShowTag" title="添加tag">
		<el-select style="width: 100%" v-model="tags" multiple>
			<el-option value="tag1">tag1</el-option>
			<el-option value="tag2">tag2</el-option>
			<el-option value="tag3">tag3</el-option>
		</el-select>
		<template #footer>
			<el-button @click="addTa" type="primary">确定</el-button>
		</template>
	</el-dialog>
// js 接口调用
 const addTa = async () => {
    await addTags({
        tags: tags.value,
        userId: row.value.id
    })
	isShowTag.value = false
	tags.value = []
	init()
}

🧓 后端部分逻辑

💻 controller

  • 前端是通过user/add/tags 路由传递来的,那后端路由要做相应的匹配
  • 前端会传来tags 和 userId ,那controller 这一层要通过对应的装饰器来对参数进行解析
  • 最后调用serveice 里的方法,并且传递解析完的参数,进行对数据的操作
@Post('/add/tags')
  addTags(@Body() params:{tags: string[], userId:number}) {
    return this.userService.addTags(params);
  }

💻 service

添加标签主要有这么几步

  • 在service 定义 addTags方法
  • 根据用户id找到当前用户的信息(因为要往指定用户下添加信息)
  • 将传递来的tag 数据添加到Tag 表中
  • 更新当前用户的数据到User表中
async addTags(params:{tags: string[], userId: number}){
    // 根据id 找到当前用户信息
    const userInfo = await this.usersRepository.findOne({where:{ id: params.userId}})
    
    const tagList:Tags[] = []
    // 通过循环,将tags 存入数据库
    for (let i = 0; i < params.tags.length; i++) {
      const T = new Tags()
      T.tags = params.tags[i]
      await this.tagsRepository.save(T)
      tagList.push(T)
    }
    // 更新当前用户的tags
    userInfo.tags = tagList
    // 将当前用户更新的值,存入到数据库
    return await this.usersRepository.save(userInfo) 
  }  

关联查询,使用 relations 关键字,传入关联的表即可

async findAll(query:{keyWord: string, page: number, pageSize: number }) {
    const data =  await this.usersRepository.find({
      //查询的时候如果需要联合查询需要增加 relations
      relations:['tags'],

      where: {
        name: Like(`%${query.keyWord}%`)
      },
      order: {
        id: "DESC"
      },
      skip: (query.page - 1)* query.pageSize,
      take: query.pageSize,
    })
    const total = await this.usersRepository.count({
      where: {
        name: Like(`%${query.keyWord}%`)
      },
    })

    return {
      data,
      total
    }
  }

🎊 总结

  • 对于联合查询,前端还是普通的传递参数,调用接口。这是后端做一个一个拆分。相当于前端拆组件,再拼接起来。
  • 联合查询有很多关系,一对多,多对一,多对多,等等。主要实现是通过typeorm,里面的装饰器OneToManyManyToOne, ManyToMany 具体可参考TypeORM 关系这一章 https://typeorm.bootcss.com/relations
  • 表关联完毕,就是数据怎么做关联
  • 根据id,找到对应的用户。
  • 根据传递来的tag,依次添加到tag 表中
  • 更新当前用户的值
  • 查询时 如果需要 联合查询需要增加 relations:['tags'] 即可,代表关联查询那张表

🏠 项目地址

  • Vue 前端地址:
    https://gitee.com/Big_Cat-AK-47/vue-project

  • nest 后端地址:https://gitee.com/Big_Cat-AK-47/nest

🎉 Nest 系列 往期文章

1. 《Nest系列 - 1. 🔥运行一个Nest项目以及整体目录学习》

2. 《Nest系列 - 2. 🔥Nest 代码生成器,让你告别base代码书写!!!》

3. 《 Nest系列 - 3. 🔥掌握常见Nest 装饰器,奠定坚实基础!!!!!!》

4. 《Nest系列 - 4. 🔥听说人人都会CRUD,可是我还不会怎么办???-《 4.1-数据库连接和实体》》

5. # 《Nest系列 - 4. 🔥听说人人都会CRUD,可是我还不会怎么办???-《4.2结合前端使用实现CRUD》

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

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

相关文章

为什么说展厅数字人是展览未来的趋势?

展厅数字人是利用数字化、智能化和网络化等信息技术手段提升展厅展览服务和游览体验的全新载体。随着人工智能和虚拟现实技术的应用发展&#xff0c;展厅数字人已成为展厅展览转型升级的重要趋势。 展厅数字人凭借其创新性、强可塑性&#xff0c;成为展厅新名片&#xff0c;为各…

数据库工具之 —— SQLite

数据库工具之 —— SQLite SQLite 是一个非常流行的轻量级数据库&#xff0c;它是一个嵌入式的数据库&#xff0c;意味着数据库文件是存储在磁盘上的一个单一文件。SQLite 不需要一个独立的服务器进程&#xff0c;这使得它非常适合用于小型应用、移动应用、桌面应用&#xff0…

阿里云centos7.9 挂载数据盘 并更改宝塔站点根目录

一、让系统显示中文 参考&#xff1a;centos7 怎么让命令行显示中文&#xff08;英文-&#xff1e;中文&#xff09;_如何在命令行中显示中文-CSDN博客 1、输入命令&#xff1a;locale -a |grep "zh_CN" 可以看到已经存在了中文包 2、输入命令&#xff1a;sudo vi…

Django REST framework安全实践:轻松实现认证、权限与限流功能

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff1…

ROT5、ROT13、ROT18、ROT47全系列加解密小程序

ROT5、ROT13、ROT18、ROT47全系列加解密小程序 这几天在看CTF相关的课程&#xff0c;涉及到古典密码学和近代密码学还有现代密码学。自己编了一个关于ROT全系列的加、解密小程序。 ​ ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码。此类编码具有可逆性&a…

use embeddings stored in vector db to reduce work for LLM generating response

题意&#xff1a;使用存储在向量数据库中的嵌入来表示&#xff0c;以减少大型语言模型&#xff08;LLM&#xff09;生成响应的工作量。 问题背景&#xff1a; Im trying to understand what the correct strategy is for storing and using embeddings in a vector database, …

计算机网路面试HTTP篇三

HTTPS RSA 握手解析 我前面讲&#xff0c;简单给大家介绍了的 HTTPS 握手过程&#xff0c;但是还不够细&#xff01; 只讲了比较基础的部分&#xff0c;所以这次我们再来深入一下 HTTPS&#xff0c;用实战抓包的方式&#xff0c;带大家再来窥探一次 HTTPS。 对于还不知道对称…

海报在线制作系统源码小程序

轻松设计&#xff0c;创意无限 一款基于ThinkPHPFastAdminUniApp开发的海报在线制作系统&#xff0c; 本系统不包含演示站中的素材模板资源。​ 一、引言&#xff1a;设计新纪元&#xff0c;在线海报制作引领潮流 在数字时代&#xff0c;海报已成为传播信息、展示创意的重要媒…

松下的台灯值得入手吗?书客、飞利浦热门品牌横评分享!

自从儿子步入小学&#xff0c;他埋首于书桌前的时光愈发冗长&#xff0c;很欣慰他能够认真专心学习&#xff0c;却也隐隐担忧他的视力健康。在了解视力健康中发现长时间在过暗或过亮的光线环境下学习&#xff0c;会导致瞳孔频繁地收缩与扩张&#xff0c;极易引发视觉疲劳。更令…

Isaac Sim 9 物理(1)

使用Python USD API 来实现 Physics 。 以下内容中&#xff0c;大部分 Python 代码可以在 Physics Python 演示脚本文件中找到&#xff0c;本文仅作为个人学习笔记。 一.设置 USD Stage 和物理场景 Setting up a USD Stage and a Physics Scene USD Stage不知道怎么翻译&#…

开放式耳机怎么选?2024全价位段机型推荐,真人实测不踩雷

作为一位深度测评耳机的专家&#xff0c;我深知对于音乐制作人员而言&#xff0c;优选一副适宜的耳机是至关重要的。我的一位朋友&#xff0c;身为音乐编辑&#xff0c;常常需长时间戴着耳机进行音频编辑与混音。他尝试了众多开放式耳机后&#xff0c;仍未找到完美契合的款式。…

使用 go-control-plane 自定义服务网格控制面

写在前面 阅读本文需要最起码了解envoy相关的概念 本文只是一个类似于demo的测试&#xff0c;只为了学习istio&#xff0c;更好的理解istio中的控制面和数据面&#xff08;pilot -> proxy&#xff09;是如何交互的&#xff0c;下图的蓝色虚线 先说go-control-plane是什么…

安宝特方案 | AR术者培养:AR眼镜如何帮助医生从“看”到“做”?

每一种新药品的上市都需要通过大量的临床试验&#xff0c;而每一种新的手术工具在普及使用之前也需要经过反复的实践和验证。医疗器械公司都面临着这样的挑战&#xff1a;如何促使保守谨慎的医生从仅仅观察新工具在手术中的应用&#xff0c;转变为在实际手术中实操这项工具。安…

简化收支记录,只留关键日期! 一键掌握财务流动,高效管理您的每一笔收支

在繁忙的生活中&#xff0c;管理个人或家庭的财务收支变得尤为重要。然而&#xff0c;传统的记账方式往往繁琐且复杂&#xff0c;让人望而却步。今天&#xff0c;我们为您推荐一款简洁易用的记账神器——晨曦记账本&#xff0c;让您轻松记录收支&#xff0c;只显示日期&#xf…

三种三相交流电动机正反转互锁电路的分析

PLC和固态继电器应用都很普及了&#xff0c;常规电磁继电器还有用武之地吗?答案是&#xff1a;有用武之地的。因为微处理器的应用使逻辑控制发生了变革&#xff0c;极大地发挥了开关功能的特性&#xff0c;但在应用中&#xff0c;它还是无法承受较大的负载&#xff0c;因此还要…

PyTorch的环境配置和安装

PyTorch环境配置及安装 初步机器学习&#xff0c;这里记录下一些学习经过&#xff0c;之后以便于自己查看&#xff0c;同时欢迎各位大佬点评&#xff0c;本节是机器计算的一个包的安装和简单验证。 安装、使用环境 Windows环境下&#xff1a;CUDA官网使用IDM下载就很快乐&am…

3 滑动窗口

滑动窗口是一种常用的数据结构和算法思想&#xff0c;广泛应用于处理数组或序列中的连续片段问题。它的核心特点是窗口的大小可以动态调整&#xff0c;但总保持一个固定大小&#xff0c;通过在序列上“滑动”来检查不同的子序列。以下是滑动窗口的一些典型应用场景&#xff1a;…

帝国cms未审核文章可视化预览效果

有时候为了让编辑更加清楚的看到别人审核之后的效果&#xff0c;同时文章有需要下一级审核才能在前端展示出来&#xff0c;今天就来展示一个未审核文章预览审核后的效果 这次给某出版社开发的时候&#xff0c;他们需要实现编辑能够预览自己发布之后的审核效果&#xff0c;所以就…

想学gis开发,java和c++那个比较好?

ava与C的应用场景不同&#xff0c;究竟选择谁&#xff0c;应该由开发者的兴趣方向来决定。 你选择Java&#xff0c;意味着以后的业务方向就是偏后台服务开发&#xff0c;如果你非得说我用java也可以写界面&#xff0c;对不起&#xff0c;别人不会。 刚好我有一些资料&#xf…

从源码到上线:直播带货系统与短视频商城APP开发全流程

很多人问小编&#xff0c;一个完整的直播带货系统和短视频商城APP是如何从源码开发到最终上线的呢&#xff1f;今天&#xff0c;笔者将详细介绍这一全过程。 一、需求分析与规划 1.市场调研与需求分析&#xff1a;首先需要进行市场调研&#xff0c;了解当前市场的需求和竞争情…