web-dev-qa-db-fra.com

Mettre à jour une relation plusieurs à plusieurs avec Typeorm

J'ai des problèmes de mise à jour d'une entité qui a un nombre de renions nombreux à plusieurs, curieux si je fais quelque chose de mal, ou plus spécifiquement quelle est la bonne façon de le faire

Considérez les entités suivantes ...

@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[];

Dans mon code, je trouve le nœud, puis essayez de le mettre à jour et d'économiser de même ...

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

Mais hélas, les sujets ne sont pas enregistrés sur la note.

Quel est le bon moyen de le faire?

Merci!

8
Jonathan

Par défaut, la cascade est définie sur FALSE, vous pouvez l'activer comme suit:

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

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

Dans mon cas, j'essaie de mettre à jour une relation existante mais qui me donne une infraction clé unique, car la relation existe déjà, j'ai donc la nécessité de supprimer toutes les relations existantes, puis d'ajouter les relations de mon utilisateur mis à jour:

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

Alors ce qui suit a-t-il de travailler pour moi:

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

Cependant, je pense toujours que la méthode Repo.Save () devrait Travail

1
Jonathan