web-dev-qa-db-ja.com

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);

しかし、残念ながら、主題はメモに保存されていません。

これを行う正しい方法は何ですか?

ありがとう!

3
Jonathan

デフォルトでは、カスケードはfalseに設定されていますが、次のようにこれを有効にできます。

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

@ManyToMany(() => Subject, (subject: Subject) => subject.notes, { cascade: true })
subjects: Subject[];
2
JudgeFudge

私の場合、既存のリレーションを更新しようとしていますが、リレーションがすでに存在するため、一意のキー違反が発生します。最初に既存のリレーションをすべて削除してから、更新したユーザーのリレーションを追加する必要があります。

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)
};
1
Nestor Perez

だから、以下は私のためにそれを機能させました:

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

それでも、repo.save()メソッドshouldが機能するように感じます

1
Jonathan