我一直在使用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。
所以,我已经禁止了User
和Post
之间的关系,并且文件现在可以理解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 })
。这并不意味着你不能使用反之亦然的关系。从Post
到User
关系,您可以仍然使用leftJoinAndSelect
加载关系。