位置: IT常识 - 正文

小满nestjs(第二十七章 nestjs typeOrm关系)(小满内容)

编辑:rootadmin
小满nestjs(第二十七章 nestjs typeOrm关系)

推荐整理分享小满nestjs(第二十七章 nestjs typeOrm关系)(小满内容),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:请问一下小满是什么,请问一下小满是什么,小满是啥呀,请问一下小满是什么,小满是啥呀,小满 2021,小满 2021,小满2020,内容如对您有帮助,希望把文章链接给更多的朋友!

在我们开始的过程中,肯定不会把数据存在一个表里面,我们会进行分表,把数据分开存,然后通过关联关系,联合查询。

typeOrm 文档 一对一 | TypeORM 中文文档

前端代码还是复用上一章的 增加了一个添加Tag

<template> <div class="wraps"> <div> <el-input v-model="search.keyWord" style="width:300px;"></el-input> <el-button @click="init" style="margin-left:10px;">搜索</el-button> <el-button @click="openDialog" type="primary" style="margin-left:10px;">添加</el-button> </div> <el-table border :data="tableData" style="width: 100%;margin-top: 30px;"> <el-table-column prop="name" label="名字" /> <el-table-column prop="desc" label="描述" /> <el-table-column prop="id" label="id" /> <el-table-column> <template #default="scope"> <el-button @click="edit(scope.row)">编辑</el-button> <el-button @click="deleteRow(scope.row)">删除</el-button> <el-button @click="(isShowTag = true,row = scope.row)">添加tag</el-button> </template> </el-table-column> </el-table> <el-pagination @current-change="change" style="float:right;margin-top:10px;" background layout="prev, pager, next" :total="total" /> </div> <el-dialog v-model="dialogVisible" title="弹框" width="50%"> <el-form :model="form"> <el-form-item prop="name" label="名称"> <el-input v-model="form.name" placeholder="名称" /> </el-form-item> <el-form-item prop="desc" label="描述"> <el-input v-model="form.desc" placeholder="描述"> </el-input> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button @click="close">关闭</el-button> <el-button type="primary" @click="save"> 保存 </el-button> </span> </template> </el-dialog> <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></template><script setup lang='ts'>import { ref, reactive } from 'vue'import type { FormInstance } from 'element-plus'import { addUser, updateUser, delUser, getList, addTags } from '@/server'const isShowTag = ref<boolean>(false)const tags = ref<string[]>([])const total = ref<number>(0)const row = ref<{ id?: number, name?: string, desc?: string, createTime?: Date}>({})const addTa = async () => { const res = await addTags({ tags: tags.value, userId: row.value.id }) isShowTag.value = false; tags.value = [];}//搜索框const search = reactive({ keyWord: "", page: 1, pageSize: 10})//表单const form = reactive({ name: "", desc: "", id: 0})//清空数据const resetForm = reactive({ ...form })//表格数据const tableData = ref([])//弹框开关const dialogVisible = ref<boolean>(false)const openDialog = () => { dialogVisible.value = true; Object.assign(form, resetForm)}//初始化表格数据const init = async () => { const list = await getList(search) tableData.value = list?.data ?? []; total.value = list?.total ?? 0}init()const change = (page) => { search.page = page; init()}//保存 和修改 表格数据const save = async () => { if (form.id) { await updateUser(form) } else { await addUser(form) } close() init()}//删除表格数据const deleteRow = async (row) => { await delUser({ id: row.id }) init()}//获取 详情const edit = (row: any) => { dialogVisible.value = true; Object.assign(form, row)}//关闭弹框const close = () => { dialogVisible.value = false;}</script><style lang='less'>* { padding: 0; margin: 0;}html,body { background: #ccc;}.wraps { height: 100vh; padding: 30px;}</style>

 新增了一个接口

import axios from 'axios'axios.defaults.baseURL = 'http://localhost:3000'export const addUser = (data) => axios.post('/user',data).then(res => res.data)export const getList = (data) => axios.get('/user',{params:data}).then(res => res.data)export const delUser = (data) => axios.delete(`/user/${data.id}`).then(res => res.data)export const updateUser = (data) => axios.patch(`/user/${data.id}`,data).then(res => res.data)//添加tagexport const addTags = (data) => axios.post(`/user/add/tags`,data).then(res => res.data)

后端Nestjs

1.新建一个 tags.entity.ts

定义Tags的数据表

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 @ManyToOne(()=>User,(user)=>user.tags) @JoinColumn() user:User}

Modal 需要关联tag表

import { Module } from '@nestjs/common';import { UserService } from './user.service';import { UserController } from './user.controller';import {TypeOrmModule} from '@nestjs/typeorm'import { User } from './entities/user.entity';import { Tags } from './entities/tags.entity';// import { example } from './entities/tags.entity';@Module({ imports:[TypeOrmModule.forFeature([User,Tags])], controllers: [UserController], providers: [UserService]})export class UserModule {}

然后user表跟tags表进行关联

import { Column, Entity, PrimaryGeneratedColumn, BeforeInsert, CreateDateColumn, Generated, OneToOne, JoinColumn, OneToMany } from 'typeorm'import { Tags } from './tags.entity'@Entity()export class User { @PrimaryGeneratedColumn() id: number @Column({ type: "varchar", length: 255 }) name: string @Column({ type: "text" }) desc: string @Generated('uuid') uuid: string @CreateDateColumn({ type: "timestamp" }) createTime: Date @OneToMany(() => Tags, (tags) => tags.user) tags:Tags[] // example: example}小满nestjs(第二十七章 nestjs typeOrm关系)(小满内容)

这儿我们解释一下  OneToMany 和 ManyToOne的用法

对于用户来说一个用户可以拥有多个tag 他们的关系是一对多 OneToMany

对于tag来说他们是多个tag指定单个用户 所以是  ManyToOne

 OneToMany  接受两个参数

第一个参数是个函数返回关联的类 所以在user表关联tag

第二个参数 创建双向关系

ManyToOne 用法一样

@OneToMany(() => Tags, (tags) => tags.user)

保存该关系

沿用上一章的代码增加Controller 增加  addTags

import { Controller, Get, Post, Body, Patch, Param, Delete, Query } from '@nestjs/common';import { UserService } from './user.service';import { CreateUserDto } from './dto/create-user.dto';import { UpdateUserDto } from './dto/update-user.dto';@Controller('user')export class UserController { constructor(private readonly userService: UserService) {} @Post('/add/tags') addTags (@Body() params:{tags:string[],userId:number}) { return this.userService.addTags(params) } @Post() create(@Body() createUserDto: CreateUserDto) { return this.userService.create(createUserDto); } @Get() findAll(@Query() query:{keyWord:string,page:number,pageSize:number}) { return this.userService.findAll(query); } @Patch(':id') update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) { return this.userService.update(+id, updateUserDto); } @Delete(':id') remove(@Param('id') id: string) { return this.userService.remove(+id); }}

service 增加 addTags 方法

import { Injectable } from '@nestjs/common';import { CreateUserDto } from './dto/create-user.dto';import { UpdateUserDto } from './dto/update-user.dto';import { Repository, Like } from 'typeorm';import { InjectRepository } from '@nestjs/typeorm';import { User } from './entities/user.entity';import { Tags } from './entities/tags.entity';// import { example } from './entities/tags.entity';@Injectable()export class UserService { constructor( @InjectRepository(User) private readonly user: Repository<User>, @InjectRepository(Tags) private readonly tag: Repository<Tags> ) { }//通过前端传入的userId 查到当前id 的用户信息,然后拿到前端传入的tags [tag1,tag2,tag3]// 进行遍历 给tag实例进行赋值 然后调用保存方法添加tag 添加完之后 通过 tagList 保存该tag类// 最后把tagList 赋给 user类的tags属性 然后重新调用save 进行更新 async addTags (params:{tags:string[],userId:number}) { const userInfo = await this.user.findOne({where:{id:params.userId}}) const tagList:Tags[] = [] for (let i = 0;i<params.tags.length;i++) { let T = new Tags() T.tags = params.tags[i]; await this.tag.save(T) tagList.push(T) } userInfo.tags = tagList; console.log(userInfo,1) return this.user.save(userInfo) } async create(createUserDto: CreateUserDto) { const data = new User() // const ex = new example() data.name = createUserDto.name data.desc = createUserDto.desc // await this.example.save(ex) return this.user.save(data) } async findAll(query: { keyWord: string, page: number, pageSize: number }) { const data = await this.user.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.user.count({ where: { name: Like(`%${query.keyWord}%`) }, }) return { data, total } } update(id: number, updateUserDto: UpdateUserDto) { return this.user.update(id, updateUserDto) } remove(id: number) { return this.user.delete(id) }}

 

如果需要联合查询需要增加   relations 注意看上面的代码

本文链接地址:https://www.jiuchutong.com/zhishi/297516.html 转载请保留说明!

上一篇:谷歌新版本跨域错误深度剖析与解决:request client is not a secure context and the resource is in more-private address(谷歌浏览器跨域解决方案)

下一篇:前端使用lottie-web,使用AE导出的JSON动画贴心教程(前端使用vue)

  • 微信朋友圈视频最长可以发一分钟时间吗(微信朋友圈视频画质被压缩,怎么解决)

    微信朋友圈视频最长可以发一分钟时间吗(微信朋友圈视频画质被压缩,怎么解决)

  • 探探发消息为啥别人收不到(探探为什么会给我发消息)

    探探发消息为啥别人收不到(探探为什么会给我发消息)

  • 苹果xr相机如何设置镜像(苹果xr相机如何背景变透明)

    苹果xr相机如何设置镜像(苹果xr相机如何背景变透明)

  • 五福是不是只能集一次(五福是不是只能合成一次)

    五福是不是只能集一次(五福是不是只能合成一次)

  • 小米5c联通4g稳定吗(小米5c联通卡)

    小米5c联通4g稳定吗(小米5c联通卡)

  • 支付宝运动怎么看好友历史运动(支付宝运动怎么开启)

    支付宝运动怎么看好友历史运动(支付宝运动怎么开启)

  • 6s充电很慢不显示雷电符号(iphone6sp充电很慢)

    6s充电很慢不显示雷电符号(iphone6sp充电很慢)

  • plc全称是什么意思(plc全称发音)

    plc全称是什么意思(plc全称发音)

  • 淘宝加入店铺会员有什么影响吗(淘宝加入店铺会员业务繁忙)

    淘宝加入店铺会员有什么影响吗(淘宝加入店铺会员业务繁忙)

  • 华为手机相机声音在哪里关闭(华为手机相机声控在哪里设置?)

    华为手机相机声音在哪里关闭(华为手机相机声控在哪里设置?)

  • 耳机录不了音怎么办(耳机录不上声音)

    耳机录不了音怎么办(耳机录不上声音)

  • cat6e是超6类网线吗(有cat6e这种网线吗)

    cat6e是超6类网线吗(有cat6e这种网线吗)

  • 一个微信可以解封几个微信(一个微信可以解绑几次)

    一个微信可以解封几个微信(一个微信可以解绑几次)

  • 快手作品推广审核不通过钱会退回来吗(快手作品推广审核怎么能通过)

    快手作品推广审核不通过钱会退回来吗(快手作品推广审核怎么能通过)

  • 淘宝下单后怎么看备注(淘宝下单后怎么改电话号码)

    淘宝下单后怎么看备注(淘宝下单后怎么改电话号码)

  • 小爱音箱连接不上手机(小爱音箱连接不上是怎么回事)

    小爱音箱连接不上手机(小爱音箱连接不上是怎么回事)

  • 店铺微淘在哪里(店家微淘在哪里进入)

    店铺微淘在哪里(店家微淘在哪里进入)

  • qq名片封面怎么删除(qq名片封面怎么设置透明)

    qq名片封面怎么删除(qq名片封面怎么设置透明)

  • 民心网里的内容怎么看(民心网的作用大吗)

    民心网里的内容怎么看(民心网的作用大吗)

  • 快手怎么改歌曲名字(快手怎么改歌曲歌词)

    快手怎么改歌曲名字(快手怎么改歌曲歌词)

  • 苹果可以控制空调吗(苹果可以控制空调开关吗)

    苹果可以控制空调吗(苹果可以控制空调开关吗)

  • 农特区块链app开发有哪些功能(农业区块链平台)

    农特区块链app开发有哪些功能(农业区块链平台)

  • 正在潜水的绿蠵龟,澳大利亚大堡礁 (© imageBROKER/Alamy)(潜水时看到的鱼)

    正在潜水的绿蠵龟,澳大利亚大堡礁 (© imageBROKER/Alamy)(潜水时看到的鱼)

  • Lesson 10.1 超参数优化与枚举网格的理论极限和随机网格搜索 RandomSearchCV(超参数及其作用)

    Lesson 10.1 超参数优化与枚举网格的理论极限和随机网格搜索 RandomSearchCV(超参数及其作用)

  • 一般纳税人税率有几种
  • 税前利润是什么利润
  • 如何合伙注册公司
  • 金税盘系统维护注册码
  • 增值税包括哪些内容
  • 更正个税申报需要做账吗
  • 资产入股会计处理
  • 分公司注销后账户不注销可以吗
  • 土地使用权分割转让依据
  • 办理企业所得税汇算清缴的期限是
  • 对方公司注销用现金还货款怎么入帐?
  • 土地出让金进项税税率
  • 公司买的设备
  • 营改增对金融服务业税负的影响
  • 微信交电费怎么退款
  • 个人所得税手续费奖励办税人员文件
  • 国税里发票采集中的税控机动车发票是指什么发票?
  • 计提城市建设维护税
  • 国家税务总局关于取消增值税扣税凭证
  • 查账征收的成本费用
  • 个人证券交易结算资金
  • 到银行开公司账户需要多少手续费
  • 公司内部培训师试讲开场白
  • 员工离职补偿金可以税前扣除吗
  • 常见的linux系统磁盘
  • 王者荣耀中吕布的克星
  • 怎么用苹果电脑查找苹果手机
  • 主营业务成本的二级科目有哪些
  • 收到政府财政拨款用于购买生产设备
  • 企业所得税征收标准
  • 销售货物结转成本会计分录
  • touch id反应慢
  • linux动态扩容
  • 出口增值税怎么计算公式
  • 原材料的帐务处理
  • 人工智能aima
  • php foreach as
  • chat form
  • 公司支付工伤赔偿,是先签字还是先打钱
  • 前端部署发布项目有哪些
  • 承兑汇票无法兑付
  • 新注册的小公司要登记社保吗
  • mysql unique null
  • mongodb 聚合
  • 一般户可以付款吗
  • 免交增值税应该计入什么科目
  • sql3表连接查询
  • 影响企业营业利润的有哪些
  • 收到社保的退费是怎么回事
  • 电费发票没有谷段电费
  • 平销返利是销售折扣吗
  • 销售奖金交税由谁承担
  • 进货没开票销售开票了
  • 开发间接费用怎么计算
  • 研发阶段的产品质检要参与
  • 工会经费支出范围
  • 现金流量表的编制基础是权责发生制
  • 预付账款属于资产类科目
  • 固定资产处置款怎么入账
  • 增资协议书范本合同
  • 公司汇票是什么
  • mysql5.6怎么用
  • 请问linux
  • 怎么提高windows7性能
  • win2008下的HPC群集是什么有什么作用
  • xp系统如何做
  • player文件怎么打开
  • win10一直重置
  • oracle linux版
  • node.js jquery
  • 三眼仔啥意思
  • python计算两个数的最大公约数
  • OnApplicationFocus
  • vue缓存数据
  • easyui表格
  • javascript运用
  • js实现兼容性较好的方法
  • js能写贪吃蛇游戏是什么水平
  • 有机肥料销售是做什么的
  • 江苏医保给家人用怎么操作
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设