【问题标题】:TypeORM - Many-to-Many-to-OneTypeORM - 多对多对一
【发布时间】:2021-05-18 13:44:40
【问题描述】:

首先,如果我使用错误的术语来描述这个问题,请原谅我。我正在学习。

当我查询公司时,我想包含地址,并且我希望地址包含地址类型。

所以,我想我是在寻求最好的方式来包含一对一的“连同”多对多的结果。

我的桌子(为了说明而稍微消毒):

  +------------------+--------------+----------------------------+
  |                              company                         |
  +------------------+--------------+----------------------------+
  | id               | int          | PRIMARY KEY AUTO_INCREMENT |
  | name             | varchar(255) |                            |
  +------------------+--------------+----------------------------+

  +------------------+--------------+----------------------------+
  |                          company_address                     |
  +------------------+--------------+----------------------------+
  | company_id       | int          |                            |
  | address_id       | int          |                            |
  +------------------+--------------+----------------------------+

  +------------------+--------------+----------------------------+
  |                              address                         |
  +------------------+--------------+----------------------------+
  | id               | int          | PRIMARY KEY AUTO_INCREMENT |
  | name             | varchar(255) |                            |
  | address_type_id  | int          |                            |
  +------------------+--------------+----------------------------+

  +------------------+--------------+----------------------------+
  |                           address_type                       |
  +------------------+--------------+----------------------------+
  | id               | int          | PRIMARY KEY AUTO_INCREMENT |
  | name             | varchar(255) |                            |
  +------------------+--------------+----------------------------+

当我查询地址时,我可以在我的地址实体中使用以下内容来获取地址类型:

...
    @OneToOne(() => AddressType)
    @JoinColumn({ name: "address_type_id" })
    addressType: AddressType;
...

在地址服务中使用以下关系时:

...
  async findOne(id: number): Promise<Address> {
    return this.addressesRepository.findOne(id,{ relations: ["addressType"] });
  }
...

当我查询公司时,我可以在公司实体中使用以下内容获取地址。但是,它不包括地址类型:

...
    @ManyToMany(() => Address)
    @JoinTable({
        name:"company_address",
        joinColumn: {
            name: "company_id",
            referencedColumnName: "id"
        },
        inverseJoinColumn: {
            name: "address_id",
            referencedColumnName: "id"
        }
    })
    addresses: Address[];
...

在公司服务中使用以下关系时:

...
  async findOne(id: number): Promise<Company> {
    return this.companiesRepository.findOne(id,{ relations: ["addresses"] });
  }
...

最初我认为它会从地址的实体定义中“正常工作”。但是,结果中缺少 addressType 列。

【问题讨论】:

    标签: typescript nestjs typeorm


    【解决方案1】:

    FindOptions 对象中的relations 字段也可以采用子关系。如给定链接中的示例所示,您需要将addresses.addressType 添加到关系数组中以将该关系包含在结果中:

    async findOne(id: number): Promise<Company> {
      return this.companiesRepository.findOne(id,
        {
          relations: ["addresses", "addresses.addressType"]
        });
    }
    

    【讨论】:

    • 这行得通。也感谢您提供文档参考!
    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 2020-08-29
    • 2020-06-29
    • 2020-06-25
    • 2021-09-25
    • 2019-01-03
    • 2020-09-01
    • 2020-12-03
    相关资源
    最近更新 更多