无法加载OneToMany-ManyToOne关系类型ORM

时间:2020-05-21 01:49:21

标签: typescript typeorm

我在加载OneToMany-ManyToOne关系中遇到困难。在此问题/错误中,我只包含真正影响到它们的部分。

GuildInfraction

@Entity()
class GuildInfraction extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  guild_id: string;

  @Column()
  moderator_id: string;

  @Column()
  user_id: string;

  @ManyToOne((_) => GuildSettings, (settings) => settings.infractions)
  @JoinColumn()
  guild: GuildSettings;

  @ManyToOne((_) => UserSettings, (settings) => settings.infractions)
  @JoinColumn()
  moderator: UserSettings;

  @ManyToOne((_) => UserSettings, (settings) => settings.infractions)
  @JoinColumn()
  user: UserSettings;
}

GuildSettings

@Entity()
class GuildSettings extends BaseEntity {
  @PrimaryColumn()
  id: string;

  @OneToMany((_) => GuildInfraction, (infraction) => infraction.guild, { eager: true })
  infractions: GuildInfraction[];
}

UserSettings

@Entity()
class UserSettings extends BaseEntity {
  @PrimaryColumn()
  id: string;

  @OneToMany((_) => GuildInfraction, (infraction) => infraction.user, { eager:true })
  infractions: GuildInfraction[];
}

这里是如何使用它的一个示例,当然,我创建了自己的班级管理器以使其更容易使用:

// Create a guild instance.
const guild = new GuildSettings();
guild.id = "554742955898961930";
guild.infractions = [];
await guild.save();

// Create a user instance.
const user = new UserSettings();
user.id = "389472120981291008";
user.infractions = [];

// Create another user instance.
const moderator = new UserSettings();
moderator.id = "506627462588006400";
moderator.infractions = [];

// Create a infraction instance and attach the previous guild, user, and moderator instances to it.
const infraction = new GuildInfraction();
infraction.guild = guild;
infraction.guild_id = guild.id;
infraction.user = user;
infraction.user_id = user.id;
infraction.moderator = moderator;
infraction.moderator_id = moderator.id;
await infraction.save();

以下是尝试使用连接存储库通过getRepository检索违规的示例:

// Through the GuildSettings repository.
const connection = getRepository(GuildSettings);
console.log((await connection.findOne("554742955898961930")).infractions); // Returns an empty array: '[]'

// Through the UserSettings repository.
const connection = getRepository(UserSettings);
console.log((await connection.findOne("389472120981291008")).infractions); // Returns an empty array '[]'

// Through the GuildInfraction repository to retrieve the guild.
const connection = getRepository(GuildInfraction);
console.log((await connection.find())[0].guild); // Returns 'undefined'

// Through the GuildInfraction repository to retrieve the user.
const connection = getRepository(GuildInfraction);
console.log((await connection.find())[0].user); // Returns 'undefined'

// Through the GuildInfraction repository to retrieve the moderator.
const connection = getRepository(GuildInfraction);
console.log((await connection.find())[0].moderator); // Returns 'undefined'

我们将非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

GuildSettings中的activation_model = models.Model(inputs=model.input, outputs=layer_outputs) 字段不是给您问题吗?它应该引发“重复列“ guild_id””错误IIRC。顺便说一句,在GuildInfraction中,您有两个与UserSettings的ManyToOne关系,该关系的反面映射到相关实体的相同字段。我不确定这是您的orm支持的东西。