- 创建多对多关系
创建多对多关系
假设一个 photo 可以放在多个 albums 中,每个 albums 可以包含多个 photo。让我们创建一个Album类:
import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable } from "typeorm";@Entity()export class Album {@PrimaryGeneratedColumn()id: number;@Column()name: string;@ManyToMany(type => Photo, photo => photo.albums)@JoinTable()photos: Photo[];}
@JoinTable需要指定这是关系的所有者方。
现在添加反向关系到Photo类:
export class Photo {/// ... other columns@ManyToMany(type => Album, album => album.photos)albums: Album[];}
运行后,ORM 将创建album_photos_photo_albums_联结表。
+-------------+--------------+----------------------------+| album_photos_photo_albums |+-------------+--------------+----------------------------+| album_id | int(11) | PRIMARY KEY FOREIGN KEY || photo_id | int(11) | PRIMARY KEY FOREIGN KEY |+-------------+--------------+----------------------------+
记得在 ORM 中使用 ConnectionOptions 注册Album类:
const options: ConnectionOptions = {// ... other optionsentities: [Photo, PhotoMetadata, Author, Album]};
现在让我们将 albums 和 photos 插入我们的数据库:
let connection = await createConnection(options);// create a few albumslet album1 = new Album();album1.name = "Bears";await connection.manager.save(album1);let album2 = new Album();album2.name = "Me";await connection.manager.save(album2);// create a few photoslet photo = new Photo();photo.name = "Me and Bears";photo.description = "I am near polar bears";photo.filename = "photo-with-bears.jpg";photo.albums = [album1, album2];await connection.manager.save(photo);// now our photo is saved and albums are attached to it// now lets load them:const loadedPhoto = await connection.getRepository(Photo).findOne(1, { relations: ["albums"] });
loadedPhoto 如下所示:
{id: 1,name: "Me and Bears",description: "I am near polar bears",filename: "photo-with-bears.jpg",albums: [{id: 1,name: "Bears"}, {id: 2,name: "Me"}]}
