在 TypeORM 中使用 'eager:true' 选项的含义
Meaning of using 'eager:true' option in TypeORM
我一直在使用 TypeORM,但在推送数据时遇到了一些问题,如下所示:
User.ts
(实体)
@OneToMany(type => Post, post => post.user)
posts: Post[]
Post.ts
(实体)
@ManyToOne(type => User, user => user.posts)
user: User
当我尝试 Create Post 时:
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()
正如我在上面标记的 PROBLEM,当我请求这个时,我得到 Cannot call method 'push of undefined
错误。
但幸运的是,我可以通过在 User.ts
文件中添加以下选项来解决这个问题:
@OneToMany(type => Post, post => post.user, {
// -------------- added --------------
eager: true
// -----------------------------------
})
posts: Post[]
我想知道为什么会这样...我已经阅读了关于 Eager 的 typeorm 文档,它说
Eager relations only work when you use find* methods. If you use QueryBuilder eager relations are disabled and have to use leftJoinAndSelect to load the relation. Eager relations can only be used on one side of the relationship, using eager: true on both sides of relationship is disallowed.
但是我不太清楚最后一句是什么意思。
eager: true on both sides of relationship is disallowed.
所以,我已经不允许 User
和 Post
之间的关系,现在文件可以理解 user.posts
被定义了吗?
有人可以帮我解决这个问题吗...?
如 Eager 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
.
加载关系
我一直在使用 TypeORM,但在推送数据时遇到了一些问题,如下所示:
User.ts
(实体)@OneToMany(type => Post, post => post.user) posts: Post[]
Post.ts
(实体)@ManyToOne(type => User, user => user.posts) user: User
当我尝试 Create Post 时:
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()
正如我在上面标记的 PROBLEM,当我请求这个时,我得到 Cannot call method 'push of undefined
错误。
但幸运的是,我可以通过在 User.ts
文件中添加以下选项来解决这个问题:
@OneToMany(type => Post, post => post.user, {
// -------------- added --------------
eager: true
// -----------------------------------
})
posts: Post[]
我想知道为什么会这样...我已经阅读了关于 Eager 的 typeorm 文档,它说
Eager relations only work when you use find* methods. If you use QueryBuilder eager relations are disabled and have to use leftJoinAndSelect to load the relation. Eager relations can only be used on one side of the relationship, using eager: true on both sides of relationship is disallowed.
但是我不太清楚最后一句是什么意思。
eager: true on both sides of relationship is disallowed.
所以,我已经不允许 User
和 Post
之间的关系,现在文件可以理解 user.posts
被定义了吗?
有人可以帮我解决这个问题吗...?
如 Eager 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
.