我对打字机还不熟悉,我正努力使这个口碑成为一种魅力。我对简单的实体没有什么大不了的:照片和相册。我有一个连接表来知道哪张照片在哪张相册里。
因此,我有以下几点:
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有什么想法吗?
发布于 2020-03-18 20:08:27
我找到了答案,问题来自专辑实体。这个名字让我有点困惑。请注意以下部分:
joinColumn: {
name: 'PI_id',
referencedColumnName: 'id',
}名称是数据库中的列名。
referencedColumnName是实体的“列”/ object属性
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"
}
]
}https://stackoverflow.com/questions/60743283
复制相似问题