首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用TypeORM更新表的多对多自定义属性

TypeORM是一个开源的对象关系映射(ORM)框架,它可以帮助开发者在Node.js和TypeScript应用程序中进行数据库操作。它支持多种数据库,包括MySQL、PostgreSQL、SQLite、Microsoft SQL Server等。

在TypeORM中,多对多关系是通过中间表来实现的。中间表包含两个外键,分别指向两个相关联的实体表。如果需要在中间表中添加自定义属性,可以使用TypeORM提供的@ManyToMany装饰器的@JoinTable选项。

以下是使用TypeORM更新表的多对多自定义属性的步骤:

  1. 首先,确保已经安装了TypeORM和相关数据库驱动程序。可以使用npm或yarn进行安装。
  2. 创建两个实体类,分别表示多对多关系的两个实体表。例如,创建一个User实体和一个Role实体。
代码语言:txt
复制
// User.ts
import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable } from 'typeorm';
import { Role } from './Role';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @ManyToMany(() => Role)
  @JoinTable()
  roles: Role[];
}

// Role.ts
import { Entity, PrimaryGeneratedColumn, Column, ManyToMany } from 'typeorm';
import { User } from './User';

@Entity()
export class Role {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @ManyToMany(() => User, user => user.roles)
  users: User[];
}
  1. 在中间表中添加自定义属性。可以在JoinTable装饰器中使用@Column装饰器来定义自定义属性。
代码语言:txt
复制
// User.ts
import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable } from 'typeorm';
import { Role } from './Role';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @ManyToMany(() => Role)
  @JoinTable({
    name: 'user_role',
    joinColumn: {
      name: 'user_id',
      referencedColumnName: 'id',
    },
    inverseJoinColumn: {
      name: 'role_id',
      referencedColumnName: 'id',
    },
  })
  roles: Role[];
}

// Role.ts
import { Entity, PrimaryGeneratedColumn, Column, ManyToMany } from 'typeorm';
import { User } from './User';

@Entity()
export class Role {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  customProperty: string;

  @ManyToMany(() => User, user => user.roles)
  users: User[];
}

在上述示例中,我们在中间表user_role中添加了一个名为customProperty的自定义属性。

  1. 使用TypeORM的实体管理器进行更新操作。可以使用getRepository方法获取实体的存储库,然后使用存储库的方法进行更新操作。
代码语言:txt
复制
import { getRepository } from 'typeorm';
import { User } from './User';
import { Role } from './Role';

async function updateUserRoles(userId: number, roleId: number, customProperty: string) {
  const userRepository = getRepository(User);
  const roleRepository = getRepository(Role);

  const user = await userRepository.findOne(userId);
  const role = await roleRepository.findOne(roleId);

  if (user && role) {
    user.roles.push(role);
    role.customProperty = customProperty;

    await userRepository.save(user);
    await roleRepository.save(role);
  }
}

在上述示例中,我们通过findOne方法获取要更新的用户和角色实体,然后将角色添加到用户的roles属性中,并更新角色的customProperty属性。最后,使用save方法保存更新后的实体。

这是使用TypeORM更新表的多对多自定义属性的基本步骤。根据具体的业务需求,可以进行适当的调整和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

NHibernate 映射数据更新

NHibernate 映射数据更新 最近在用 NHibernate 做更新时突然发现 NHibernate 更新策略很差, 多关系更新居然是先全部删除再插入全部数据, 感觉非常奇怪..., 再添加一个新角色, NHibernate 生成 SQL 语句如下(仅包含关系 User_Role 操作): DELETE FROM [User_Role] WHERE [UserId] =...Tip: Use set for many-to-many associations 发现了解决方案, 将映射 bag 改为用 set , 问题终于得到了解决, 改过后映射如下: Set(...不只是, 如果你集合需要更新, NHibernate 推荐是: 19.5.2....sess.Flush(); 由此可见, bag 在映射更新时性能较差, 如果不需要更新,则可以放心使用, 在需要更新时则 set 是更好选择。

94910

Hbase篇--HBase中一设计

一.前述 今天分享一篇关于HBase案例分析。...二.具体案例 案例一.    人员-角色   人员有多个角色  角色优先级   角色有多个人员   人员 删除添加角色   角色 可以添加删除人员   人员 角色 删除添加 ?...PS:说明,两张User和Role, User中定义两个列族,第一个列族是名字,第二个列族中  多个列定义为具体角色,列内容定义为具体值,即优先级(这里利用了列也能存信息,所以把角色Id定义为具体列...,值越大代表优先级越高) 案例二.一 组织架构 部门-子部门   查询 顶级部门 查询 每个部门所有子部门   部门 添加、删除子部门   部门 添加、删除 ?...PS:解释 一个 rowkey中0代顶级部门  1代非顶级部门  因为顶级部门不是经常查  列族列是具体子部门列表。值是具体名称。

2K30
  • DRF中ManytoMany字段更新和添加

    orderId 是自动生成UUID订单区域是外键,下单人也是外键,菜品orderMenu是一个多字段(其实通过我查到方法说都是外键字段就可以实现但是个人觉得菜品和订单应该是多会比较好理解...)就这样给自己挖了坑因为想要在添加订单同时也要添加对应菜品数量于是自定义了中间并且添加了数量字段(噩梦开始~~~)首先是定义模型类models.py# models.pyimport django.utils.timezone...') for i in orderMenu: # 我思路是既然不能在更新主表时候更新多字段那就单独把多字段提出来更新 # 在传入多字段时候同步传入需要更新中间...#print(serializer.instance.pk) # 遍历多字段 for i in orderMenu: # 找到需要更新那个中间对应...,在写时候又发现了代码中几个bug1、可以更新不是订单人菜品2、更新时候只能更新已经生成菜品内容,因为无法为订单添加新菜品,这个涉及到中间对应关系已经确定了。

    91820

    python【第二十篇】Django、Ajax

    1 创建多表方式有两种 1.1 方式一:自定义关系 1 class Host(models.Model): 2 nid = models.AutoField(primary_key=...models.ForeignKey(to='Host',to_field='nid') 14 aobj = models.ForeignKey(to='Application',to_field='id') 那么我们可以通过第三张操作...HostToApp,增删改查各种关系: models.HostToApp.objects.create(hobj_id=1,aobj_id=2) 1.2 方式二:自动创建第三张 1 class...9 name = models.CharField(max_length=32) 10 r = models.ManyToManyField("Host") 这种方式无法直接操作第三张,...但是可以通过10行r这个对象,进行间接操作第三张: obj = models.Application.objects.get(id=1) obj.name # 第三张操作 # 添加 obj.r.add

    73520

    自定义 Django 管理界面中内联模型

    问题背景在 Django 管理界面中,用户可以使用内联模型来管理一关系。但是,当一多关系是多时,Django 提供默认内联模型可能并不适合。...例如,如果存在一个产品模型和一个发票模型,并且产品和发票之间是关系,那么在发票管理界面中,Django 会显示一个表格,其中包含所有产品及其对应复选框。...这种形式内联模型对于管理少量产品还可以接受,但是如果产品数量很多,那么这种内联模型就会非常不美观和难以使用。2. 解决方案为了解决这个问题,我们可以自定义内联模型显示方式。...这两个方法分别负责判断用户是否有添加和修改内联模型对象将新内联模型类添加到 ModelAdmin 类中。在 ModelAdmin 类 inlines 属性中,添加新内联模型类。...下面是一个示例代码,演示了如何自定义内联模型显示方式:from django.contrib import adminfrom django.contrib.admin.utils import

    11510

    基于ERNIE3.0信息抽取算法:属性关系抽取

    [信息抽取]基于ERNIE3.0信息抽取算法:属性关系抽取 实体关系,实体属性抽取是信息抽取关键任务;实体关系抽取是指从一段文本中抽取关系三元组,实体属性抽取是指从一段文本中抽取属性三元组;信息抽取一般分以下几种情况一一...,一一,情况: 一一:“张三男汉族硕士学历”含有一属性三元组(张三,民族,汉族)。...,上海证券交易所上市) 一:“上海森焱软件有限公司和上海欧提软件有限公司注册资本均为100万人民币”,含有属性三元组(上海森焱软件有限公司,注册资本,100万人民币)和(上海欧提软件有限公司...,注册资本,100万人民币) :“大华种业稻麦种子加工36.29万吨、销售37.5万吨;苏垦米业大米加工22.02万吨、销售24.86万吨”,含有属性三元组(大华种业,稻麦种子产量,...,主要是使用可ERNIEKIT组件,整体效果非常不错,当然追求小样本学习可以参考之前UIE项目或者去官网看看paddlenlp最新更新训练和部署进行了提速。

    1.3K30

    【Mybatis】常见面试题:处理之间关系:一,一

    员工与部门有对应关系,实体类之间也有对应关系 一 在员工实体类中加入实体类部门属性 Dept dept; 查询员工信息以及员工所对应部门信息 方式一:级联方式处理映射关系 <resultMap...association处理映射关系 association专门处理映射关系 * property:表示需要处理一关系属性名 * javaType:表示该属性类型 <resultMap...唯一标识(namespacesqlID或mapper接口全类名.方法名 column:设置分步查询条件 property:处理实体中属性 <resultMap id="empAndDeptByStepResultMap...在部门实体类中加入员工类构成<em>的</em>集合 private List emps; 方式一:collection collection:用来处理一<em>对</em><em>多</em><em>的</em>映射关系 property:处理一<em>对</em>多关系<em>的</em><em>属性</em>...-- collection:用来处理一<em>对</em><em>多</em><em>的</em>映射关系 property:处理一<em>对</em>多关系<em>的</em><em>属性</em> ofType:表示该<em>属性</em>对应<em>的</em>集合中存储<em>的</em>数据<em>的</em>类型

    15110

    基于ERNIE3.0信息抽取算法:属性关系抽取

    信息抽取基于ERNIE3.0信息抽取算法:属性关系抽取实体关系,实体属性抽取是信息抽取关键任务;实体关系抽取是指从一段文本中抽取关系三元组,实体属性抽取是指从一段文本中抽取属性三元组;信息抽取一般分以下几种情况一一...,一一,情况:一一:“张三男汉族硕士学历”含有一属性三元组(张三,民族,汉族)。...,上海证券交易所上市)一:“上海森焱软件有限公司和上海欧提软件有限公司注册资本均为100万人民币”,含有属性三元组(上海森焱软件有限公司,注册资本,100万人民币)和(上海欧提软件有限公司...,注册资本,100万人民币):“大华种业稻麦种子加工36.29万吨、销售37.5万吨;苏垦米业大米加工22.02万吨、销售24.86万吨”,含有属性三元组(大华种业,稻麦种子产量,36.29...,主要是使用可ERNIEKIT组件,整体效果非常不错,当然追求小样本学习可以参考之前UIE项目或者去官网看看paddlenlp最新更新训练和部署进行了提速。

    1.7K00

    多关系创建方式、forms组件

    多关系三种创建方式 1.全自动,Django自动创建 class Book(models.Model): title = models.CharField(max_length=20)...#不足:不再支持orm跨查询,不支持正反向查询概念,不支持内置第三张操作四个方法 3.半自动(推荐使用) 参数: through:指定第三张关系 through_fields:指定第三张中哪两个字段维护之间多关系...框默认值 required 默认为True控制字段是否必填 widget 给input框设置样式及属性 error_messages 设置报错信息 #widget使用方法如下 widget...,需要注意choices选项可以配置从数据库中获取,但是由于是静态字段 获取值无法实时更新,需要重写构造方法从而实现choice实时更新。..._post_clean()里面没有内容,我们源码之旅到此结束。 通过看源码我们发现局部钩子和全局钩子分别通过反射和对象属性方法查找顺序两种方式实现自动调用。

    5.2K00

    hibernate之关于使用连接实现一关联映射

    大家好,又见面了,我是全栈君 【Hibernate】之关于使用连接实现一关联映射 在我们项目使用中採用中间最多一般就是一,或者是,当然一使用中间也是能够,可是这样几率通常少之又少...所以这里重点介绍一和一採用中间进行关联映射! 依旧採用Group和Person来描写叙述这个逻辑!...private String name; private Integer age; private Group group; @ManyToOne //以下是配置中间核心.../> 写这篇文章,我特意查询了一下网上文章...,发现大家都是採用XML配置,所以我这里也写了Annotations配置,由于JPA中Annotations使用起来远比XML要方便!

    61720

    Django 多字段更新和插入数据实例

    :DjangoManyToManyField()使用以及through作用 创建一个经典多关系:一本书可以有多个作者,一个作者可以有本书(如下) ?...在创建BookAuthor类最后使用自定义名称,这个也可以不用指定,系统可以自动生成名 仔细观察BookAuthor这个类,也就是我们前面讲到中间模型,同时我们看到在创建中间模型时候我们创建了两个外键...,这两个外键定义了两个模型之间是如何关联到一起 所以当创建多关系模型时候提倡使用through参数去指定并创建中间模型,这样比较方便我们进行字段扩展 那么此时我们又该如何添加和删除多关系呢...BookAuthor(author=ringo,book=book) # 第二种添加方式 m2 = BookAuthor.objects,create(author=paul,book=book1) 当我们使用中间模型之后...,add(),remove(),create()这些方法都会被禁用,所以在创建这种类型关系时候唯一方法就是通过创建中间模型实例 以上这篇Django 多字段更新和插入数据实例就是小编分享给大家全部内容了

    4.3K30

    使用iptables租户环境中TCP限速

    这样用户在开发时候就可以直接通过这个 TCP 端口测试服务,而不用自己开一个 SideCar 使用 UDS 了。 因为所有人都要用这一个地址做开发,所以就有互相影响问题。...我在使用说明文档里用红色大字写了这是开发测试用,不能压测,还是有一些视力不好同事会强行压测。隔三差五我就得去解释一番,礼貌地请同事不要再这样做了。 最近实在累了。...方法是在 Per-IP rate limiting with iptables[1] 学习到,这个公司是提供一个租户 SaaS 服务,也有类似的问题:有一些非正常用户 abuse 他们服务,由于...详细实现方法可以参考这篇文章。 iptables 本身是无状态,每一个进入 packet 都单独判断规则。...因为这个应用内部就可以控制了,但是我这里是想所有的 packet 进行限速,所以就不需要用到这个 module) 完整命令如下: $ iptables --new-chain SOCAT-RATE-LIMIT

    84120

    场景下exists子查询比join连查询快这么

    两张查询可以使用join、exists和in等方式,其中exists和in都属于依赖子查询。参考博客1给出了三种方式使用场景。...首次优化 查询语句中,tenant_id、store_id和create_time等字段限定只对sku进行了限制,而没有送货单做限制,导致只有sku使用了索引,而送货单没能走索引。...其实仔细分析我们sql语句,导致使用临时和filesort原因是我们使用了group by,因为我们使用了join查询,为了避免重复,我们必须要使用group by或distinct来去重。...再分析我们业务场景:在我们业务场景中,一个送货单对应多个商品,属于典型使用exists就可以避免使用group by或distinct,其性能肯定能好于join。...最后,我们order by使用是create_time字段。

    1.3K30

    使用VBA删除工作列中重复行

    标签:VBA 自Excel 2010发布以来,已经具备删除工作中重复行功能,如下图1所示,即功能区“数据”选项卡“数据工具——删除重复值”。...图1 使用VBA,可以自动执行这样操作,删除工作所有数据列中重复行,或者指定列重复行。 下面的Excel VBA代码,用于删除特定工作所有列中所有重复行。...Cols(i) = i + 1 Next i rng.RemoveDuplicates Columns:=(Cols), Header:=xlYes End Sub 这里使用了当前区域...如果只想删除指定列(例如第1、2、3列)中重复项,那么可以使用下面的代码: Sub DeDupeColSpecific() Cells.RemoveDuplicates Columns:=Array...(1, 2, 3), Header:=xlYes End Sub 可以修改代码中代表列数字,以删除你想要列中重复行。

    11.3K30

    efcore使用ShardingCore实现分分库下租户

    ,零依赖、零学习成本、零业务代码入侵,并且支持读写分离动态分分库,同一种路由可以完全自定义新星组件,通过本框架你不但可以学到很多分片思想和技巧,并且更能学到Expression奇思妙用 项目地址...,那么这个在实际应用中将是不切实际,所以虽然分库可以用来进行租户但是一般没人会真的这样操作,那么就没有办法在ShardingCore使用合理租户外加分分库了吗,针对这个问题ShardingCore...,支持配置下每个配置都可以拥有自己数据库来进行分分库读写分离 动态配置,支持动态添加多配置(目前不支持动态删减配置,后续会支持如果有需要) 场景 假设我们有这么一个租户系统,这个系统在我们创建好账号后会分配给我们一个单独数据库和对应信息...UpdateOrder GetOrders 总结 通过上述功能演示相信很多小伙伴应该已经知道他具体运作流程了,通过配置多个租户信息,在ShardingCore上实现配置,动态配置,来保证在租户模式下分库读写分离依然可以使用...如果你需要开发一个大型程序,领导上来就是分库分,那么在以前大概率是会花费非常精力在处理分片这件事情上,而最终项目是否可以做完并且使用还是一个巨大问题,但是现在不一样了,毕竟ShardingCore

    1.5K10

    为啥用去重构造单号,建间关系时仍然提示,这明显是唯一值啊!|PBI实战

    这是星球里一位星友提问: 其中发货单,是从某个订单表里通过values函数构建唯一值: 但是,当用这个去和其他事实构建间关系时,会被识别为: 为什么会这样?...经检查发现,用values函数构建这个发货单号,中间存在空白内容,也就是说,原来事实表里本身就存在空白(没有发货单号)情况! 这里正是这个空内容导致!...可以和事实表里订单号为空内容关联? 但是,在DAX里,这不可以,因为,会存在歧义,当存在空内容时,无法建立一关系。 为什么呢?...从“原理”上来说,你可以这么理解,在Power BI(或说Power Pivot)数据模型里,会自动给一端添加一个“隐藏空值”,用于匹配多端表里无法匹配到内容,而你表里本身又有一个空值,从而导致了有...其实也很简单,通过筛选去掉空值即可: FILTER( VALUES('应收账款U8T+'[发货单号]), '应收账款U8T+'[发货单号]blank() ) 此前,我还曾经发过一篇也是关于间关系构建存在类似问题文章

    28430
    领券