Как реализовать операции поиска и фильтрации в loopback 4?

Я хочу реализовать возможности поиска, фильтрации и разбивки на страницы для модели, которую я создал в Loopback 4. У меня есть 7 API-интерфейсов CRUD по умолчанию для созданной мной модели, но все работает нормально.

Теперь я хочу добавить возможности списка (поиск, пагинация фильтров и т. Д.), Как реализовать, что для этого нет надлежащей документации в документации Loopback 4. Может ли кто-нибудь помочь мне реализовать это.

Спасибо


person Yash Rahurikar    schedule 10.09.2019    source источник


Ответы (2)


Да, документация неполная, но похоже, что они работают над этим.

Между тем, вы можете попробовать find() на repository с параметрами where и or вместе. Для разбивки на страницы параметры offset и limit работают нормально. Более подробная информация о фильтре доступна здесь в их документации. Подробная информация о CrudConnector.find() методе доступна здесь.

Для справки я прикреплю свой фрагмент кода и буду использовать его по своему усмотрению.

/**
   * customer.repository.ts
   * mongodb datasource
   * @param [searchKey] Search in `firstName`, `lastName`, or `email`
   * @param [pageIndex] page number. If provided, `pageSize` is required
   * @param [pageSize] records per page. If provided, `pageIndex` is required
   * @returns {CustomerInfoInterface[]} List of customers sorted by `firstName`
   */
  async getCustomerList(searchKey?: string, pageIndex?: number, pageSize?: number): Promise<CustomerInfoInterface[]> {
    const searchParam = searchKey || '';
    const searchParams = [
      {firstName: {like: searchParam, options: 'i'}},
      {lastName: {like: searchParam, options: 'i'}},
      {email: {like: searchParam, options: 'i'}},
    ];
    var filterObject = {where: {or: searchParams}, order: ['firstName ASC']};
    if (pageIndex && pageSize) {
      const offset = (pageIndex - 1) * pageSize;
      const limit = pageSize;
      filterObject = Object.assign(filterObject, {limit, offset});
    }
    logger.debug('search user list with search query');
    logger.debug(filterObject);
    const customerList = await this.find(filterObject);
    return customerList.map(i => ({
      customerId: i.customerId,
      firstName: i.firstName,
      lastName: i.lastName,
      phone: i.phone,
      address: i.address,
      id: i.customerId,
    }));
  }
person Salitha    schedule 11.09.2019
comment
Откуда вы получаете searchKey, pageIndex и pageSize? - person Yash Rahurikar; 16.09.2019
comment
Должен ли я для поиска вставлять точно такое же значение в поле поиска? например, filter [where] [name] = John Doe. Разве я не могу просто найти Джона, и он должен дать мне результат, но прямо сейчас он дает мне пустой ответ, когда я просто ищу Джона, есть ли какой-либо способ? - person Yash Rahurikar; 16.09.2019
comment
Это функция, которая выполняет поиск и возвращает обещание (массив). Так что вам нужно позвонить откуда-то еще. Звоню с контроллера. Вам не нужно указывать точное значение. Прочтите документацию MongoDB. Обратите внимание, что мой код не совсем то, что вам нужно. поэтому вам нужно понять концепцию и реализовать свою собственную. удачи - person Salitha; 16.09.2019

Как упоминалось в другом ответе, документация для LoopBack 4 еще не завершена.

Для поиска и фильтрации записей LoopBack 4 использует тот же синтаксис запроса, что и LoopBack 3, оба на уровне TypeScript (см. Определения типов в файле loopback-datasource-juggler query.d.ts) и уровень REST API (через контроллеры, созданные командой lb4 controller).

В результате большая часть документации LoopBack 3 применима и к LoopBack 4. См. Раздел Фильтры в Запрашивая данные, чтобы начать работу, проверьте подстраницы, например Where filter для получения дополнительной информации о различных полях фильтрации.

person Miroslav Bajtoš    schedule 13.09.2019
comment
Куда писать фильтры? в контроллерах? - person Yash Rahurikar; 16.09.2019
comment
Должен ли я для поиска вставлять точно такое же значение в поле поиска? например, filter [where] [name] = John Doe. Разве я не могу просто найти Джона, и он должен дать мне результат, но прямо сейчас он дает мне пустой ответ, когда я просто ищу Джона, есть ли какой-либо способ? - person Yash Rahurikar; 16.09.2019
comment
LoopBack по умолчанию использует оператор равенства. filter[where][name]=John Doe возвращает все записи, в которых имя совпадает с John Doe. Используйте like или ilike, чтобы указать более сложное соответствие. См. loopback.io/doc/en/lb3/Where -filter.html # like-and-nlike. - person Miroslav Bajtoš; 16.09.2019