[英]Sequelize use LEFT JOINs instead of nested INNER JOIN for many-to-many association
我在 Sequelize (MySQL) 中設置了三個模型——Book、Author 和 Book_author(連接表)。 我設置了以下關聯:
Book.belongsToMany(Author,
{
through: Book_author,
foreignKey: 'book_id'
}
);
Author.belongsToMany(Book,
{
through: Book_author,
foreignKey: 'author_id'
}
);
當我在 Book 模型上嘗試 findAll 查詢時,如下所示......
Book.findAll({
include: [
{ model: Author
}
]
}).then(bookList => {
// do something with the bookList
});
...它生成具有以下結構的原始 SQL 查詢(我刪除了各個屬性以保持簡潔):
SELECT book.*, author.* FROM book
LEFT JOIN (author
INNER JOIN book_author
ON author.author_id = book_author.author_id)
ON book.book_id = book_author.book_id;
但是,嵌套的 INNER JOIN 使我的查詢變慢。 單獨測試原始 SQL 查詢時也是如此,因此這不是 Sequelize 問題。 為了緩解這種情況,我希望原始 SQL 查詢僅使用 LEFT JOIN,如下所示:
SELECT book.*, author.* FROM book
LEFT JOIN book_author
ON book.book_id = book_author.book_id
LEFT JOIN author
ON author.author_id = book_author.author_id;
我需要如何更改 Sequelize 模型和/或 findAll includes
屬性才能獲得此結果? 我試過在includes
屬性中使用required: false
,但這只會影響外部 JOIN ,而不影響嵌套的 JOIN 。 有沒有辦法在不使用sequelize.query
情況下做到這sequelize.query
? 感謝您的任何幫助!
您可以使用兩個belongsTo
關聯而不是belongsToMany
:
Book.hasMany(BookAuthor);
BookAuthor.belongsTo(Author);
const bookList = await Book.findAll({
include: [{
model: BookAuthor,
required: false,
include: [{
model: Author,
required: false
}]
}]
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.