【问题标题】:Typeorm many to many relation joinColumnsTypeorm 多对多关系 joinColumns
【发布时间】:2020-06-29 18:25:51
【问题描述】:

我是 typeorm 的新手,我正试图让这个 orm 成为一种魅力。 我对简单的实体没有什么大不了的:照片和相册。我有一个连接表,可以知道哪个图片在哪个相册中。

所以我有以下内容:

import {
  Entity, PrimaryGeneratedColumn, Column, OneToMany, JoinTable,
} from 'typeorm';
import { PicturesModel } from '../pictures/pictures.model';

@Entity({
  name: 'T_ALBUM_AL',
  synchronize: true,
})
export class AlbumModel {
  @PrimaryGeneratedColumn({
    name: 'AL_id',
  })
  id: number;

  @Column({
    name: 'AL_name',
  })
  name: string;

  @Column({
    name: 'AL_created_at',
  })
  created_at: Date;

  @Column({
    name: 'AL_updated_at',
  })
  updated_at: Date;

  @JoinTable({
    name: 'TJ_PICTURE_ALBUM_PA',
    joinColumn: {
      name: 'PI_id',
      referencedColumnName: 'PI_id',
    },
  })
  @OneToMany(() => PicturesModel, (pictures: PicturesModel) => pictures.id)
  pictures: PicturesModel[]
}


import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity({
  name: 'T_PICTURE_PI',
  synchronize: true,
})
export class PicturesModel {
  @PrimaryGeneratedColumn({
    name: 'PI_id',
  })
  id: number;

  @Column({
    name: 'PI_name',
  })
  name: string;

  @Column({
    name: 'PI_path',
  })
  path: string;

  @Column({
    name: 'PI_created_at',
  })
  created_at: Date;

  @Column({
    name: 'PI_updated_at',
  })
  updated_at: Date;

  @Column({
    name: 'PI_size',
  })
  size: number;
}

所以我有以下模型:请注意,用户逻辑尚未实现。

我有一个非常小的控制器来获取相册,我想检索其中的每个相册和每张图片:

import { Request, Response } from 'express';
import { getRepository } from 'typeorm';

import { AlbumModel } from './album.model';

class Album {
  public static async getAlbums(_req: Request, res: Response): Promise<Response> {
    try {
      const picture = await getRepository(AlbumModel).find({ relations: ['pictures'] });
      return res.json(picture);
    } catch (e) {
      console.error(e);
      return res.json('fail');
    }
  }
}

export default Album;

当我调用此控制器时,我收到以下错误:但是 joinColumns 指定正确

TypeError: Cannot read property 'joinColumns' of undefined
    at /<something>/src/query-builder/SelectQueryBuilder.ts:1500:61
    at Array.map (<anonymous>)
    at SelectQueryBuilder.createJoinExpression (/<something>/src/query-builder/SelectQueryBuilder.ts:1470:57)
    at SelectQueryBuilder.getQuery (/<something>/src/query-builder/SelectQueryBuilder.ts:54:21)
    at SelectQueryBuilder.QueryBuilder.getQueryAndParameters (/<something>/src/query-builder/QueryBuilder.ts:415:28)
    at SelectQueryBuilder.<anonymous> (/<something>/src/query-builder/SelectQueryBuilder.ts:1956:40)
    at step (/<something>/node_modules/tslib/tslib.js:139:27)
    at Object.next (/<something>/node_modules/tslib/tslib.js:120:57)
    at /<something>/node_modules/tslib/tslib.js:113:75

有什么想法吗?

【问题讨论】:

    标签: typescript orm typeorm


    【解决方案1】:

    我找到了答案,问题来自专辑实体。命名对我来说有点混乱。注意部分:

        joinColumn: {
          name: 'PI_id',
          referencedColumnName: 'id',
       }
    

    name是数据库中的列名

    referencedColumnName 是您的实体的“列”/对象属性

    import {
      Entity, PrimaryGeneratedColumn, Column, JoinTable, ManyToMany,
    } from 'typeorm';
    import { PicturesModel } from '../pictures/pictures.model';
    
    @Entity({
      name: 'T_ALBUM_AL',
      synchronize: true,
    })
    export class AlbumModel {
      @PrimaryGeneratedColumn({
        name: 'AL_id',
      })
      id: number;
    
      @Column({
        name: 'AL_name',
      })
      name: string;
    
      @Column({
        name: 'AL_created_at',
      })
      created_at: Date;
    
      @Column({
        name: 'AL_updated_at',
      })
      updated_at: Date;
    
      @ManyToMany(() => PicturesModel, (picture: PicturesModel) => picture.id)
      @JoinTable({
        name: 'TJ_PICTURE_ALBUM_PA',
        joinColumn: {
          name: 'PI_id',
          referencedColumnName: 'id',
        },
        inverseJoinColumn: {
          name: 'PI_id',
          referencedColumnName: 'id',
        },
      })
      pictures: PicturesModel[]
    }
    

    最后这给了我想要的输出:

    {
        "id":1,
       "name":"aa",
       "created_at":"2020-03-16T23:00:00.000Z",
       "updated_at":"2020-03-16T23:00:00.000Z",
       "pictures":[
          {
             "id":1,
             "name":"Pic 1",
             "path":"Path",
             "created_at":"2020-03-17T23:00:00.000Z",
             "updated_at":"2020-03-17T23:00:00.000Z",
             "size":"2"
          }
       ]
    }
    

    【讨论】:

      猜你喜欢
      • 2020-09-01
      • 2020-12-03
      • 2020-09-27
      • 2021-12-26
      • 2020-10-10
      • 2020-09-02
      • 2021-12-23
      • 2020-10-15
      • 1970-01-01
      相关资源
      最近更新 更多