Цикл 4: отношение «многие ко многим» - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь реализовать способ фильтрации данных в таблицах, имеющих отношение ManytoMany.

У меня есть следующие таблицы job, job_category и category.

Пока я думаю сделатьзапрос к job_category с использованием job_id, а затем использовать этот результат для добавления условия с помощью IN (), но я не нахожу никакого способа и улучшить этот параметр.

Вопросы:

  1. Как реализовать отношение ManytoMany в Loopback 4?

  2. Как отфильтровать запрос, используя IN?

PD Я могу использовать $ inq для вопроса № 2.

filter.where = {
   ...filter.where,
   id: {inq: [2, 7]},
};

1 Ответ

0 голосов
/ 01 апреля 2019

С учетом контекста вашего вопроса в lb4 может быть реализовано отношение «многие ко многим», как показано ниже.

Модель заданий (пример) -

    @model({
      name: 'jobs',
    })
    export class Job extends Entity {
      @property({
        type: 'number',
        id: true,
      })
      id: number;

      @property({
        type: 'string',
        required: true,
      })
      name: string;

      // Other columns of the table.....

      constructor(data?: Partial<Job>) {
        super(data);
      }
    }

Категориимодель (образец) -

    @model({
      name: 'categories',
    })
    export class Category extends Entity {
      @property({
        type: 'number',
        id: true,
      })
      id: number;

      @property({
        type: 'string',
        required: true,
      })
      name: string;

      // Other columns of the table.....

      constructor(data?: Partial<Category>) {
        super(data);
      }
    }

В модели отношений категории заданий мы собираемся реализовать отношение , принадлежащее , как с моделями заданий, так и с моделями категорий.Это обеспечит связь m: n.

    @model({
      name: 'job_categories',
    })
    export class JobCategory extends Entity {
      @property({
        type: 'number',
        id: true,
      })
      id: number;

      @belongsTo(() => Job)
      job_id: number;

      @belongsTo(() => Category)
      category_id: number;

      constructor(data?: Partial<JobCategory>) {
        super(data);
      }
    }

Теперь, используя CLI lb4, вы можете создать репозиторий и контроллер REST для модели категорий работ и использовать там методы поиска для извлечения данных.К сожалению, параметр include в классе Filter для методов поиска еще не реализован в lb4.Его все еще WIP.Для получения обновлений обратитесь к этой ветке из цикла loopback-next.До этого вам может потребоваться добавить пользовательскую логику t контроллера или классы репозитория для достижения этой цели.Ниже приведены два предложенных подхода с моей стороны.

  1. Настройка относится к отношению в хранилище (см. Документацию здесь ) и использовать его внутри контроллера для получения ответов с соответствующими данными (см. Реализацию здесь ).Возможно, вам придется создать собственную модель ответа для этого.Для этого мы создали собственный DTO.В качестве ответа вы также можете вернуть «любой» тип, но это не рекомендуется.
  2. При необходимости вы можете выполнить свой собственный запрос на соединение.Это родной подход к запросу.Но, к сожалению, снова функция execute в классе репозитория пока не реализована.Смотрите здесь .Его доступно в DTS, хотя.Итак, мы реализовали обходной путь до его реализации.Мы создали базовый класс репозитория, который будет наследоваться всеми классами репозитория в нашем приложении (заменив все extends DefaultCrudRepository на extends AppDefaultCrudRepository ).Вот реализация для базового репозитория.
    export abstract class AppDefaultCrudRepository<
      T extends Entity,
      ID
    > extends DefaultCrudRepository<T, ID> {
      constructor(
        entityClass: typeof Entity & {
          prototype: T;
        },
        dataSource: AppDataSource,
      ) {
        super(entityClass, dataSource);
      }

      execute(
        command: Command,
        parameters: NamedParameters | PositionalParameters,
        options?: Options,
      ): Promise<AnyObject> {
        // Commented below statement until it is implemented in lb4
        // return super.execute(command, parameters, options);
        return this.dataSource.execute(command, parameters, options);
      }
    }

Надеюсь, это поможет с вашим вопросом №1.На вопрос № 2 вы уже упомянули подход.Это работает.

...