Сохранение связанной записи в Nest
Пусть новый материал уже собран в памяти, а автор ещё не лежит в своей таблице. Одной записи материала мало: сначала нужна строка человека, иначе ключ некуда поставить.
Соседа привязывают через поле
author на объекте поста.
Сначала отправляют автора
в базу, затем материал
с уже присвоенным объектом.
Два отдельных шага без
каскадного удаления хватает,
чтобы связь сохранилась.
Покажем на примере поста и автора:
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
import { Author } from './author.entity.js';
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@ManyToOne(() => Author, (author) => author.posts)
author: Author;
}
В сервисе создадим автора, присвоим его посту и отправим оба объекта по очереди:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Author } from '../author.entity.js';
import { Post } from '../post.entity.js';
@Injectable()
export class PostService {
constructor(
@InjectRepository(Post) private postRepository: Repository<Post>,
@InjectRepository(Author) private authorRepository: Repository<Author>,
) {}
async createPostWithAuthor(
title: string,
authorName: string,
): Promise<Post> {
const author = this.authorRepository.create({ name: authorName });
await this.authorRepository.save(author);
const post = this.postRepository.create({ title });
post.author = author;
return this.postRepository.save(post);
}
}
Модуль темы регистрирует сущности и сервис:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Author } from '../author.entity.js';
import { Post } from '../post.entity.js';
import { PostService } from './post.service.js';
@Module({
imports: [TypeOrmModule.forFeature([Post, Author])],
providers: [PostService],
})
export class PostsModule {}
Корень подключает базу с созданием таблиц при старте:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PostsModule } from './posts/posts.module.js';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'postgres',
password: 'postgres',
database: 'site',
autoLoadEntities: true,
synchronize: true,
}),
PostsModule,
],
})
export class AppModule {}
Сохраните Worker и Department
двумя шагами с присвоением
отдела работнику, зарегистрируйте
сущности в WorkersModule
и подключите модуль к корню
с созданием таблиц при старте.