我使用Laravel作为一个主要的后端应用程序,我想连接到该应用的数据库。我为Node.js选择了Typeorm,在其中使用Javascript和babel编译器。
我正试图通过透视表在用户和挑战实体之间创建一个多对多的关系。
用户:
import { EntitySchema } from 'typeorm'
import User from '../models/User'
export default new EntitySchema({
name: 'User',
target: User,
tableName: 'users',
columns: {
id: {
primary: true,
type: 'int',
generated: true
},
email: {
type: 'varchar',
nullable: false,
unique: true
},
name: {
type: 'varchar',
nullable: false
}
}
}, {
relations: {
challenges: {
name: 'challenges',
target: 'Challenge',
type: 'many-to-many',
joinTable: {
name: 'users_challenges',
joinColumn: {
name: 'user_id'
}
},
cascade: true
}
}
})挑战:
import { EntitySchema } from 'typeorm'
import Challenge from '../models/Challenge'
export default new EntitySchema({
target: Challenge,
name: 'Challenge',
tableName: 'challenges',
columns: {
id: {
primary: true,
type: 'int',
generated: true
},
title: {
type: 'varchar',
nullable: false
},
description: {
type: 'text',
nullable: false
}
}
}, {
relations: {
users: {
target: 'User',
type: 'many-to-many',
joinTable: {
name: 'users_challenges',
joinColumn: {
name: 'challenge_id'
}
}
}
}
})枢轴表有下列列:
id
user_id
challenge_id有了以上所有这些,我尝试从users表中查询数据:
const userRepository = (await db()).getRepository(User)
const profile = await userRepository
.findOne({ id: req.body.userId }, {
relations: ['challenges']
})
console.log(profile)我得到了一个错误:
Error: Relation "challenges" was not found, please check if it is correct and really exist in your entity.我该怎么做呢?
发布于 2020-06-19 01:29:55
我与我的一个好友一起调试了这个程序,并通过源代码和示例代码来找出正确的方法,使用EntitySchema建立“双向”关系。
根据文档,关系必须由一方拥有,只有一方才能拥有,而不管它是否是双向关系(这意味着您将从任何一方访问关系)。当一段关系被一方“拥有”时,正如它的功率在上面的评论中提到的那样。这意味着每个关系可能只有一个joinTable配置。
在您的示例中:让我们假设User拥有这种关系。这相当于将整个joinTable配置对象放在User EntitySchema对象上:
...
relations: {
challenges: {
name: 'challenges',
target: 'Challenge',
type: 'many-to-many',
joinTable: {
name: 'users_challenges',
joinColumn: {
name: 'user_id'
},
inverseJoinColumn: {
name: 'challenge_id'
},
},
inverseSide: 'User', <--- This needs to match the `target` of the users relation in the Challenge EntitySchema
cascade: true
}
}
...将inverseJoinColumn键添加到joinTable配置中,并将inverseSide添加到challenges对象。
为了从您的users EntitySchema访问Challenge关系,您可以将配置设置为至少如下:
...
relations: {
users: {
type: 'many-to-many',
inverseSide: 'challenges',
target: 'User' <--- This needs to match the `inverseSide` of the challenges relation in the User EntitySchema
}
}
...这允许您从关系的两个方面运行查询:
从用户方面:
const userChallenges = await userRepository.findOne(1, { relations: ['challenges'] }从挑战方面:
const challengeUsers = await challengeRepository.findOne(1, { relations: ['users'] }https://stackoverflow.com/questions/62374043
复制相似问题