Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как разбить результаты на страницы при фильтрации по левому столбцу таблицы соединений

Автор вопроса: NikolayОтветов: 1

Давайте определим, например, эти сущности:

@Entity()
export class Author {

  @OneToMany(() => Book, book => book.author)
  books = new Collection<Book>(this);
}

@Entity()
export class Book {

  @Property()
  name: string;

  @ManyToOne()
  author: Author;
}
const authors = await authorRepository.find({ books: {name: 'Test'} }, {
  limit: 10
});

Как видите, я хочу выбрать всех авторов, у которых есть книги с названием "Тест", но это сгенерирует следующий запрос:

select `e0`.* from `author` as `e0`
left join `book` as `e1` on `e0`.`id` = `e1`.`author_id`
where `e1`.`name` = 'Test' limit 10

Проблема в том, что когда у меня более 2 авторов, и у каждого из них более 10 книг с именем "Тест", этот запрос вернет только первого автора из-за ограничения.

Я не уверен, является ли это ошибкой в ​​ORM или ожидаемым поведением.

Один из способов исправить это - выбрать все строки без предложения limit и выполнить разбиение на страницы в памяти, как это делается в спящем режиме, но я не уверен, сколько памяти будет использоваться с очень большими таблицами, и это может заблокировать цикл событий в NodeJS при их обработке.

mikro-orm

Ответы

Ответ 1 · рейтинг 1 · Martin Adámek

Здесь вы можете вернуться к построителю запросов, чтобы применить предложение group by:

const qb = await authorRepository.createQueryBuilder('a');
qb.select('a.*').where({ books: { name: 'Test' } }).limit(10).groupBy('a.id');
const authors = await qb.getResult();

Подумаем, как поддержать этот вариант использования напрямую через EM/repository API.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы