РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
⊗jsnsPmRnMM 165 of 168 menu
◀ ▶

Связь многие ко многим в Nest

Пусть у материала много меток, и одна метка встречается у разных материалов. Одной колонки с числом для этого не хватит: нужна отдельная таблица пар идентификаторов.

Связь «многие ко многим» задают пометкой ManyToMany на поле-массиве. Пометка JoinTable на стороне поста создаёт таблицу-связку между двумя ключами.

Покажем на примере постов:

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class Tag { @PrimaryGeneratedColumn() id: number; @Column() name: string; }

У материала добавим список меток и таблицу связей:

import { Column, Entity, JoinTable, ManyToMany, PrimaryGeneratedColumn, } from 'typeorm'; import { Tag } from './tag.entity.js'; @Entity() export class Post { @PrimaryGeneratedColumn() id: number; @Column() title: string; @ManyToMany(() => Tag) @JoinTable() tags: Tag[]; }

Регистрируем пост и метку в модуле темы:

import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Post } from '../post.entity.js'; import { Tag } from '../tag.entity.js'; @Module({ imports: [TypeOrmModule.forFeature([Post, Tag])], }) 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 и подключите модуль к корню с созданием таблиц при старте.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить