在TypeORM中使用"eager:true"选项的含义



我一直在使用TypeORM,在推送数据时遇到了一些问题,如下所示:

  • User.ts(实体)
    @OneToMany(type => Post, post => post.user)
    posts: Post[]
    
  • Post.ts(实体)
    @ManyToOne(type => User, user => user.posts)
    user: User
    

当我尝试像这样创建帖子时:

  • createPost.ts
    
    // Some Codes...
    // Save Post
    const post =  Post.create({
    title: title,
    content: content
    })
    await post.save()
    // Update User
    const user = await User.findOne({ uid: ctx.uid })
    user.posts.push(post)  // ****************** PROBLEM ******************
    await user.save()
    

当我在上面标记问题时,当我请求时,我得到了Cannot call method 'push of undefined错误。

但幸运的是,我可以通过在User.ts文件中添加以下选项来解决这个问题:

@OneToMany(type => Post, post => post.user, {
// -------------- added --------------
eager: true
// -----------------------------------
})
posts: Post[]

我想知道为什么这样。。。我读过关于Eagle的打字文档,上面写着

Eager关系只有在使用find*方法时才有效。如果使用QueryBuilder,则会禁用急切关系,并且必须使用leftJoinAndSelect来加载关系。热切的关系只能用于关系的一方,使用热切:关系的双方都是真实的是不允许的。

但我不确定最后一句是什么意思。

热切:关系双方都不允许为true。

所以,我已经禁止了UserPost之间的关系,并且文件现在可以理解user.posts是定义的吗?

有人能帮我做这个吗。。。?

如Eagle Loading Documentaion中所述,您只能在关系的一侧设置eager: true。这意味着你必须定义如下关系。

User.ts

@OneToMany(type => Post, post => post.user, { eager: true })
posts: Post[]

和在Post.ts

@ManyToOne(type => User, user => user.posts)
user: User

在这里,如果您在将自动加载Post关系的函数中使用await User.findOne({ uid: ctx.uid })。这并不意味着你不能使用反之亦然的关系。从PostUser关系,您可以仍然使用leftJoinAndSelect加载关系。

最新更新