Связь один к одному в Nest
Пусть у материала не больше одной обложки, и обложка не делится между строками. Это другой масштаб, чем «много статей у одного автора»: с обеих сторон по одной записи.
Связь «один к одному» задают
пометкой OneToOne. Колонку
с ключом обычно держат на
стороне, где связь обязательна.
Пометка JoinColumn говорит,
что внешний ключ лежит
в таблице поста.
Покажем на примере постов:
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Cover {
@PrimaryGeneratedColumn()
id: number;
@Column()
url: string;
}
У материала добавим поле обложки и колонку связи:
import {
Column,
Entity,
JoinColumn,
OneToOne,
PrimaryGeneratedColumn,
} from 'typeorm';
import { Cover } from './cover.entity.js';
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@OneToOne(() => Cover)
@JoinColumn()
cover: Cover;
}
Обе сущности передаём в forFeature модуля темы:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Cover } from '../cover.entity.js';
import { Post } from '../post.entity.js';
@Module({
imports: [TypeOrmModule.forFeature([Post, Cover])],
})
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 и одну
запись профиля один к одному
с колонкой на стороне работника,
зарегистрируйте сущности
в WorkersModule и подключите
модуль к корню с созданием
таблиц при старте.