Существуют две таблицы: Books
, список доступных книг и книги " BorrowedBooks
книги", в которых перечислены книги, которые в настоящее время заимствованы. Я хочу получить только те книги, которые в настоящее время доступны (не заимствованы), обеспечивая разбивку на страницы и общее число.
Я бы использовал метод findAndCountAll
предоставленный Sequelize, который действительно прост в использовании и выполняет большинство работ, но он не работает должным образом. Я пробовал следующий фрагмент кода, используя метод findAll
, который работает правильно.
Books.findAll({
where: { '$BorrowedBooks.bookId$': null },
include: [BorrowedBooks]
}).then(...).catch(...);
Затем я изменил метод findAndCountAll
, чтобы получить общее количество элементов, а также обеспечить разбиение на страницы.
Books.findAndCountAll({
where: { '$BorrowedBooks.bookId$': null },
include: [BorrowedBooks],
offset: offset,
limit: limit,
distinct: true
}).then(...).catch(...);
Эта версия вызывает ошибку Unknown column 'BorrowedBooks.bookId' in 'where clause'
.
РЕДАКТИРОВАТЬ
Сгенерированный запрос с фрагментом кода, который не работает, следующий:
SELECT
'books'.*,
'borrowedBooks'.'bookId' AS 'borrowedBooks.bookId',
'borrowedBooks'.'userId' AS 'borrowedBooks.userId',
FROM
(SELECT
'books'.'id',
'books'.'title',
'books'.'author',
'books'.'isbn'
FROM
'books' AS books'
WHERE
(SELECT
'bookId'
FROM
'borrowedBooks'
WHERE
('borrowedBooks'.'bookId' = 'books'.'id'
AND 'borrowedBooks'.'bookId' IS NULL)
LIMIT 1) IS NOT NULL
LIMIT 0 , 10) AS 'books'
INNER JOIN
'borrowedBooks' ON 'books'.'id' = 'borrowedBooks'.'bookId'
AND 'borrowedBooks'.'bookId' IS NULL;
Если я напишу непосредственно запрос, я бы сделал что-то вроде этого:
SELECT * FROM 'books'
LEFT OUTER JOIN 'borrowedBooks' ON 'books'.'id' = 'borrowedBooks'.'bookId'
WHERE 'borrowedBooks'.'bookId' IS NULL
Я думаю, что ошибка связана с INNER JOIN, который использует Sequelize.
Правильный синтаксис для использования включает
Books.findAll({
include: [{
model: BorrowedBooks,
where: {
bookId: null
}
}],
offset: offset,
limit: limit,
distinct: true
}).then(...).catch(...);