У меня возникают проблемы с обновлением объекта, который имеет отношение "многие ко многим", мне интересно, делаю ли я что-то не так, или, более конкретно, как правильно это сделать
Рассмотрим следующие сущности ...
@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);
Но, увы, на заметке не сохранились сюжеты.
Как правильно это сделать?
Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Итак, у меня получилось следующее:
subjectIds.forEach(async id => {
await connection
.createQueryBuilder()
.relation(Note, 'subjects')
.of(note)
.add(id);
});
Хотя я все еще чувствую, что метод repo.save () должен работает
Вам не нужен forEach. .add также принимает массив идентификаторов. Следует немного упростить код.
По умолчанию для каскадирования установлено значение 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); тогда будет работать.
это работает для добавления новых субъектов, но что, если мы хотим заменить эти идентификаторы другими идентификаторами? Обязательно ли использовать .relation().of().addAndRemove()?
.save() не работает, даже когда вы пытаетесь удалить элемент из таблицы соединений «многие ко многим».
В моем случае я пытаюсь обновить существующее отношение, но это дает мне нарушение уникального ключа, потому что отношение уже существует, поэтому мне сначала нужно удалить все существующие отношения, а затем добавить отношения моего обновленного пользователя:
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)
};
Лучше объединить все эти операции в одну транзакцию.
Итак, означает ли это, что мы должны писать отдельные запросы, если нужно внести больше изменений, как в ответе Нестора Переса?