Many-to-one / one-to-many relations
import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from "typeorm";
import {Photo} from "./Photo";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(type => Photo, photo => photo.user)
photos: Photo[];
Here we added @OneToMany
to the photos
property and specified the target relation type to be Photo
.You can omit @JoinColumn
in a @ManyToOne
/ @OneToMany
relation.@OneToMany
cannot exist without @ManyToOne
.If you want to use @OneToMany
, @ManyToOne
is required. However, the inverse is not required: If you only care about the @ManyToOne
relationship, you can define it without having @OneToMany
on the related entity.Where you set @ManyToOne
- its related entity will have “relation id” and foreign key.
This example will produce following tables:
const photo1 = new Photo();
photo1.url = "me.jpg";
await connection.manager.save(photo1);
const photo2 = new Photo();
photo2.url = "me-and-bears.jpg";
await connection.manager.save(photo2);
const user = new User();
user.name = "John";
user.photos = [photo1, photo2];
await connection.manager.save(user);
or alternative you can do:
With cascades enabled you can save this relation with only one save
call.
const userRepository = connection.getRepository(User);
const users = await userRepository.find({ relations: ["photos"] });
// or from inverse side
const photoRepository = connection.getRepository(Photo);
Or using QueryBuilder
you can join them:
With eager loading enabled on a relation you don’t have to specify relation or join it - it will ALWAYS be loaded automatically.