Микро-орм Cascade.REMOVE, это только для СУБД?

Я использую микро-орм с MongoDB и пытаюсь сделать Cascade.REMOVE, но я не могу заставить его работать.

Субъект предпринимательской деятельности:

@Entity({ collection: "business" })
export class BusinessModel implements BusinessEntity {
    @PrimaryKey()
    public _id!: ObjectId;

    @Property()
    public name!: string;

    @Property()
    public description!: string;

    @OneToMany({ entity: () => LocationModel, fk: "business", cascade: [Cascade.ALL] })
    public locations: Collection<LocationModel> = new Collection(this);
}

export interface BusinessModel extends IEntity<string> { }

Сущность местоположения:

@Entity({ collection: "location" })
export class LocationModel implements LocationEntity {
    @PrimaryKey()
    public _id!: ObjectId;

    @Property()
    public geometry!: GeometryEmbedded;

    @ManyToOne({ entity: () => BusinessModel})
    public business!: BusinessModel;

    public distance?: number;
}

export interface LocationModel extends IEntity<string> { }

Бизнес-данные:

_id: 5cac818273243d1439866227
name: "Prueba"
description: "Prueba eliminacion"

Данные о местоположении:

_id: 5cac9807179e380df8e43b6c
geometry: Object
business: 5cac818273243d1439866227

_id: 5cacc941c55fbb0854f86939
geometry: Object
business: 5cac818273243d1439866227

И код:

export default class BusinessData {
    private businessRepository: EntityRepository<BusinessModel>;

    public constructor(@inject(OrmClient) ormClient: OrmClient) {
        this.businessRepository = ormClient.em.getRepository(BusinessModel);
    }

    public async delete(id: string): Promise<number> {
        return await this.businessRepository.remove(id);
    }
}

«Бизнес» правильно удален, но все связанные с ним «местоположения» остаются там.

Журнал показывает только:

[query-logger] db.getCollection("business").deleteMany() [took 0 ms]

Просто любопытно - вы действительно получили это из регистратора запросов или удалили часть where? Если да, то уверены ли вы, что указываете значение параметра id?

Martin Adámek 10.04.2019 12:35

Нет, я не удалил часть where и предоставил значение для параметра id. Изменение кода на: public async delete(id: string): Promise<number> { // tslint:disable-next-line: no-console console.info(id); return await this.businessRepository.remove(id); } Вот вывод после обнаружения объекта, ничего не удаляя: 5cac818273243d1439866227 [query-logger] db.getCollection("business").deleteMany() [took 0 ms]

alexojegu 10.04.2019 12:48

Только что проверил код, его нет только в логгере запросов, условие не пропускается при запросе к БД. Исправлю как можно скорее, выглядит довольно страшно :]

Martin Adámek 10.04.2019 12:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
814
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Каскады работают на уровне приложений, поэтому для всех драйверов, включая mongo.

Проблема здесь в том, что вы удаляете объект Business по идентификатору. Вам нужно удалить его по ссылке — укажите сущность и убедитесь, что у вас заполнена коллекция, иначе ORM не знает, какие сущности удалять каскадно.

Попробуйте это так:

export default class BusinessData {
  public async delete(id: string): Promise<number> {
    const business = await this.businessRepository.findOne(id, ['locations'])
    return await this.businessRepository.remove(business);
  }
}

Ваш подход с удалением по id будет работать только в том случае, если сущность уже загружена в карту идентификации (она же управляется EM), включая коллекцию locations.

Да, это работает. Спасибо (надеюсь не сильно напрягаю)

alexojegu 10.04.2019 12:57

Точно нет! Спасибо за хорошие вопросы! Я сделаю страницу часто задаваемых вопросов, основанную на них в ближайшем будущем.

Martin Adámek 10.04.2019 12:58

Другие вопросы по теме