Обновите отношения "многие ко многим" с помощью TypeORM

У меня возникают проблемы с обновлением объекта, который имеет отношение "многие ко многим", мне интересно, делаю ли я что-то не так, или, более конкретно, как правильно это сделать

Рассмотрим следующие сущности ...

@Entity
class Subject
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  name: string;

  @ManyToMany(() => Note, note => note.subjects)
  @JoinTable()
  notes: Note[];

  ...

@Entity()
export class Note {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @ManyToMany(() => Subject, (subject: Subject) => subject.notes)
  subjects: Subject[];

В моем коде я нахожу узел, а затем пытаюсь обновить его и сохранить вот так ...

const note = await noteRepo.findOneOrFail(noteId);
const foundSubjects = await subjectRepo.findByIds(Array.from(subjectIds));
note.subjects = foundSubjects;
noteRepo.save(note);

Но, увы, на заметке не сохранились сюжеты.

Как правильно это сделать?

Спасибо!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
11
0
19 512
3

Ответы 3

Итак, у меня получилось следующее:

  subjectIds.forEach(async id => {
  await connection
    .createQueryBuilder()
    .relation(Note, 'subjects')
    .of(note)
    .add(id);
});

Хотя я все еще чувствую, что метод repo.save () должен работает

Итак, означает ли это, что мы должны писать отдельные запросы, если нужно внести больше изменений, как в ответе Нестора Переса?

Jay Surya 13.11.2019 07:06

Вам не нужен forEach. .add также принимает массив идентификаторов. Следует немного упростить код.

James 10.05.2021 22:10

По умолчанию для каскадирования установлено значение false, вы можете включить это следующим образом:

@Entity()
export class Note {
@PrimaryGeneratedColumn('uuid')
id: string;

@ManyToMany(() => Subject, (subject: Subject) => subject.notes, { cascade: true })
subjects: Subject[];
note.subjects = [{id:1}, {id:2}]; noteRepo.save(note); тогда будет работать.
Ambroise Rabier 29.04.2019 17:26

это работает для добавления новых субъектов, но что, если мы хотим заменить эти идентификаторы другими идентификаторами? Обязательно ли использовать .relation().of().addAndRemove()?

Jay Surya 13.11.2019 07:09
.save() не работает, даже когда вы пытаетесь удалить элемент из таблицы соединений «многие ко многим».
H.Rahimy 07.09.2021 15:05

В моем случае я пытаюсь обновить существующее отношение, но это дает мне нарушение уникального ключа, потому что отношение уже существует, поэтому мне сначала нужно удалить все существующие отношения, а затем добавить отношения моего обновленного пользователя:

export const updateUser = async (user: User): Promise<User | undefined> => {
    /**
     * Get the actual relationships of that user.
     */
    const actualRelationships = await getRepository(User)
        .createQueryBuilder()
        .relation(User, 'roles')
        .of(user).loadMany();

    /**
     * Add new relationships of the user, and delete the old relationships.
     */
    await getRepository(User)
        .createQueryBuilder()
        .relation(User, 'roles')
        .of(user)
        .addAndRemove(user.roles, actualRelationships);

    /**
     * Update only the table USER.
     */
    await getRepository(User)
        .createQueryBuilder()
        .update()
        .set({
            name: user.name,
            username: user.username,
            active: user.active
        })
        .where('id = :id', {id: user.id})
        .execute();

    /**
     * Return the updated user
     */
    return await getUser(user.id, true, true)
};

Лучше объединить все эти операции в одну транзакцию.

Mohammad Abu Musâ Robı 20.09.2021 12:05

Другие вопросы по теме