Mysql Sequelize对多对多关联使用左连接而不是嵌套的内部连接
我在Sequelize(MySQL)中设置了三个模型——Book、Author和Book_Author(联接表)。我成立了以下协会:Mysql Sequelize对多对多关联使用左连接而不是嵌套的内部连接,mysql,sequelize.js,Mysql,Sequelize.js,我在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.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查询(我删除了各个属性以保持简洁):
但是,嵌套的内部联接使我的查询速度变慢。单独测试原始SQL查询时也是如此,因此这不是一个续集问题。为了缓解这种情况,我希望原始SQL查询只使用左连接,如下所示:
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
,但这只影响外部联接,而不影响嵌套联接。是否有任何方法可以不使用sequelize.query
?谢谢你的帮助 您可以使用两个belongsTo
关联,而不是belongstomy
:
Book.hasMany(图书作者);
作者:贝朗斯托(作者);
const bookList=wait Book.findAll({
包括:[{
模特:图书作者,
必填项:false,
包括:[{
模特:作者,
必填项:false
}]
}]
});
你有没有想到这一点?
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;