使用 TypeOrm 中的关系更新表

Posted

技术标签:

【中文标题】使用 TypeOrm 中的关系更新表【英文标题】:Update a table with its relations in TypeOrm 【发布时间】:2022-01-22 07:23:17 【问题描述】:

我们有:

Postgres 数据库

照片:

import Entity, PrimaryGeneratedColumn, Column, ManyToOne from "typeorm";
import User from "./User";

@Entity()
export class Photo 

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    url: string;

    @ManyToOne(() => User, user => user.photos)
    user: User;


用户:

import Entity, PrimaryGeneratedColumn, Column, OneToMany from "typeorm";
import Photo from "./Photo";

@Entity()
export class User 

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @OneToMany(() => Photo, photo => photo.user)
    photos: Photo[];


表格:

+-------------+--------------+----------------------------+
|                         photo                           |
+-------------+--------------+----------------------------+
| id          | int(11)      | PRIMARY KEY AUTO_INCREMENT |
| url         | varchar(255) |                            |
| userId      | int(11)      | FOREIGN KEY                |
+-------------+--------------+----------------------------+

+-------------+--------------+----------------------------+
|                          user                           |
+-------------+--------------+----------------------------+
| id          | int(11)      | PRIMARY KEY AUTO_INCREMENT |
| name        | varchar(255) |                            |
+-------------+--------------+----------------------------+

所以一个用户可能有几张照片。

我想更新一位用户并更新他们的照片(这是一张不同的表格)。

以下是更新用户的方法:

await getRepository(User).update( id , userData);

问题是如何同时更新用户的照片?

请注意,当用户当前有 3 张照片时可能会出现问题,但例如您设置的是 2 张。所以你正在减少照片的数量。

【问题讨论】:

【参考方案1】:

也许你可以这样做

例如

import  getConnection  from "typeorm";
     

const conn = getConnection();
    
const id_user = id;

const user = await conn.createQueryBuilder()
.update("user")
.set(
 id_photo:new_id_photo
)
.where("id_user= :id_user", id_user ).
.returning("*")
.execute();

return user.raw;

显然你必须改变一些值?。

【讨论】:

谢谢。但是 set 可以接受一个数组吗?一个用户可以拥有许多我可能想要更新的照片。 如果我做对了,这个请求只会更新一张照片。它不会更新其他用户的数据,不是吗? 是的,set可以接受一个数组,请给我你的userData 很遗憾我没有真实的数据,这只是一个例子来理解当你有这样的表结构时如何与目标实体一起保存关系的概念。我实际上是从官方文档中获取这个例子的。但是他们没有说如何更新它,而他们说如何选择和添加新行。 typeorm.io/#/many-to-one-one-to-many-relations 假设 userData 是 name: "Gena", photos: [ url: "photoUrl1", url: "photoUrl2"] 如果有帮助,我可以以某种方式更改数据结构。 如果只有一张照片,您的示例就可以完美运行。 "set" 似乎不接受数组。

以上是关于使用 TypeOrm 中的关系更新表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 typeorm nestjs 加入 3 个关系表

TypeORM 无关联关系的mysql多表连接查询

TypeOrm 不会在更新时保存实体及其关系

typeORM 多对多关系不同情况的处理

TypeORM 更新实体/表

TypeORM/MySQL:无法删除或更新父行:外键约束失败