【问题标题】:TypeORM insert row with foreign keyTypeORM 用外键插入行
【发布时间】:2021-11-02 19:48:35
【问题描述】:

我之间有一个@OneToMany 关系
聊天室 1 ---- M > 消息
我遇到的问题是,每当我尝试插入一条消息(或大量消息)时, ChatRoom 的外键为空。
另外,我正在上传我的设置。

@Entity("messages")
export class Message {

    @PrimaryColumn()
    id: string;

    @ManyToOne(() => ChatRoom, chatroom => chatroom.messages)
    chatRoom: ChatRoom | undefined

    @Column({nullable: false})
    message: string;

    @Column({nullable: false})
    receiver: string;

    @Column({nullable: false})
    created_utc: Date;
}
@Entity("chatrooms")
export class ChatRoom {

    @PrimaryColumn()
    id: string;

    @OneToMany(() => Message, message => message.chatRoom, {
        cascade: ["insert", "remove"]
    })
    @JoinColumn({name: 'id'})
    messages: Message[];

    @Column()
    last_msg: string;

    @Column()
    last_msg_created_utc: Date;

    @Column()
    num_messages: number;

    @Column()
    num_replies: number;

    @Column()
    seen: boolean;

}

问题:

当尝试对许多消息创建批量插入时,我注意到查询没有设置外键任何值,而是 NULL

我尝试插入的消息 json:

{
 id: '1',
 message: 'text',
 receiver: 'someone',
 created_utc: 'utc date...',
 chatRoomId: '123' -> chat room id exists 
}

the query looks like this :
(this query is for single insert not bulk, but it goes the same for bulk)
INSERT INTO "messages"("id", "message", "receiver", "created_utc", "chatRoomId") VALUES ($1, $2, $3, $4, DEFAULT) -- PARAMETERS: [" bJU7","Zdravo test","kompir_zomba","2021-
09-05T09:53:54.693Z"]

这告诉我在插入行时甚至没有考虑 chatRoomId。 该表如下所示

我用来插入消息的 Typeorm 插入查询

@InjectRepository(Message) private messageRepository: Repository<Message>
.....

    this.messageRepository.save(message);

有人知道如何进行吗?

【问题讨论】:

    标签: node.js typescript postgresql typeorm


    【解决方案1】:

    我在处理 NestJS 项目时遇到了与 TypeORM 类似的问题。

    原因:

    出现问题是因为您的 消息实体 (class Message) 中没有定义任何 chatRoomId 字段。因此,当 TypORM 将您的消息数据映射到 Message 实体 时,它不会设置 chatRoomId

    解决方案:

    有两种解决方案可以解决此问题。

    1. 您可以在Message 实体中添加chatRoomId 字段,现在您可以在保存消息数据时发送该字段。

    例如

    @Column({type: "uuid"}) // <- Assuming that your primary key type is UUID (OR you can have "char")
    chatRoomId: string;
    

    现在,通常您不需要为此创建迁移,因为 该字段已存在于数据库表中。

    1. 另一种方法是在保存时将ChatRoom 实体的实例传递给message 对象。

    您可以首先使用其 ID 找到聊天室,然后将其传递到消息对象中。

    您的最终message 对象应如下所示:

    {
     id: '1',
     message: 'text',
     receiver: 'someone',
     created_utc: 'utc date...',
     chatRoom: chatRoomData // <-- Assuming that chatRoomData contains the ChatRoom entity
    }
    

    【讨论】:

    • 谢谢!!经过昨晚的实验,我得到了你的解决方案,但我不太喜欢它。解决方案 1 更清洁,我喜欢它。非常感谢!
    • @Liki 很高兴听到它对你有用。实际上,第一种解决方案更简洁,代码和开销更少。另外,如果您能将其标记为您问题的已接受答案,我将不胜感激。 :) 谢谢!
    • 当然,忘记了。对于未来的读者,对于解决方案2,您不需要传递所有数据(如果您没有级联更新..),您只能传递带有ID字段的实体(其他为空),它仍然会工作。
    猜你喜欢
    • 1970-01-01
    • 2022-10-06
    • 2021-09-24
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多