【问题标题】:Can't load OneToMany-ManyToOne Relationship TypeORM无法加载 OneToMany-ManyToOne 关系类型ORM
【发布时间】:2020-05-24 08:01:13
【问题描述】:

我在加载 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'

非常感谢您的帮助!

【问题讨论】:

    标签: typescript typeorm


    【解决方案1】:

    GuildSettings 中的guild 字段不是给您带来问题吗?它应该抛出一个“重复列“guild_id””错误 IIRC。顺便说一句,在 GuildInfraction 中,您有两个与 UserSettings 的 ManyToOne 关系,并且关系的反面映射到相关实体的同一字段。我不确定这是您的 orm 支持的东西。

    【讨论】:

    • 嗯,我相信我完全没有使用关系的想法,现在我只是使用一个巨大的管理器,实例系统。
    猜你喜欢
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2012-10-05
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    相关资源
    最近更新 更多