多対多の関係を持つエンティティの更新に問題があります。何か間違ったことをしているのかどうか、より具体的にはこれを行う正しい方法は何ですか。
次のエンティティを検討してください...
@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);
しかし、残念ながら、主題はメモに保存されていません。
これを行う正しい方法は何ですか?
ありがとう!
デフォルトでは、カスケードはfalseに設定されていますが、次のようにこれを有効にできます。
@Entity()
export class Note {
@PrimaryGeneratedColumn('uuid')
id: string;
@ManyToMany(() => Subject, (subject: Subject) => subject.notes, { cascade: true })
subjects: Subject[];
私の場合、既存のリレーションを更新しようとしていますが、リレーションがすでに存在するため、一意のキー違反が発生します。最初に既存のリレーションをすべて削除してから、更新したユーザーのリレーションを追加する必要があります。
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)
};
だから、以下は私のためにそれを機能させました:
subjectIds.forEach(async id => {
await connection
.createQueryBuilder()
.relation(Note, 'subjects')
.of(note)
.add(id);
});
それでも、repo.save()メソッドshouldが機能するように感じます