Nest Js обновление отношения «многие ко многим» с таблицей соединений - PullRequest
0 голосов
/ 16 января 2020

У меня есть две сущности - собственность и владелец. Одно свойство может иметь много владельцев, а владелец может иметь много свойств. Для объединения используйте таблицу property_owner. Как обновить это отношение «многие ко многим» с помощью NestJS / TypeORM?

@Entity('property')
export class Property extends EntityModel {

    @Column({ length: 255, nullable: false })
    name: string;

    @ManyToMany(type => Owner, { cascade: true })
    @JoinTable({
        name: 'property_owner',
        joinColumn: { name: 'propertyId', referencedColumnName: 'id'},
        inverseJoinColumn: { name: 'ownerId', referencedColumnName: 'id'},
    })
    owners: Owner[];
}


@Entity('owner')
export class Owner extends EntityModel {

    @Column({ length: 255, nullable: false })
    name: string;

    @ManyToMany(type => Property, { cascade: true })
    @JoinTable({
        name: 'property_owner',
        joinColumn: { name: 'ownerId', referencedColumnName: 'id'},
        inverseJoinColumn: { name: 'propertyId', referencedColumnName: 'id'},
    })
    properties: Property[];
}

Ниже приведены методы сохранения и обновления моего сервиса:

public create(req: Request): Promise<Dto> {
    const dto: CreateDto = {
      ...req.body,
      owners: this.formatJoinData(req.body.owners) //[1,2,3] => [{id:1},{id:2},{id:3}]
    };

    const entity = Object.assign(new Entity(), dto);
    return this.repo.save(entity);
  }

  public update(req: Request): Promise<UpdateResult> {
    const dto: EditDto = {
      ...req.body,
      owners: this.formatJoinData(req.body.owners) //[1,2,3] => [{id:1},{id:2},{id:3}]
    };

    const id = req.params.id;
    const entity = Object.assign(new Entity(), dto);
    return this.repo.update(id, entity);
  }

Сохранение нового свойства работает нормально, но когда Я пытаюсь обновить свойство и получаю ошибку

 [ExceptionsHandler] column "propertyId" of relation "property" does not exist

Данные о владельцах в обоих случаях выглядят как [{id: 1}, {id: 2}, {id: 3}]. Я думаю, что проблема в методах сохранения / обновления результатов. Метод сохранения возвращает нам Entity с идентификатором, а метод обновления возвращает нам UpdateResult, который не содержит идентификатора Entity. Но, может быть, мы можем преобразовать / дополнительно определить это значение где-нибудь ...

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Я нашел решение. Нужно вызвать метод сохранения вместо обновления. В моем случае обновление будет выглядеть так:

import {plainToClass} from 'class-transformer';

public async update(req: Request): Promise<Dto> {

    const found = await this.repo.findOneOrFail(req.params.id, {
                    relations: ['owners', 'electricMeter'],
                  });

    const dto = {
      ...found,
      ...req.body,
      owners: this.formatJoinData(req.body.owners) //[1,2,3] => [{id:1},{id:2},{id:3}]
      updatedBy: this.getUser(req),
      updatedDate: Date.now(),
    };

    return this.repo.save(plainToClass(Entity, dto));
  }

Этот код можно улучшить, но думаю, что основная идея ясна.

0 голосов
/ 16 января 2020

https://typeorm.io/# / отношения многие-ко-многим документация не говорит больше, чем использование JoinTable декоратора, и мы не знаем, что у вас в запросе, но похоже вы передаете неправильные значения. Эти поля являются виртуальными, в конце с отношением m2m создается третья таблица для обработки отношения.

...