簡體   English   中英

Sequelize 使用 LEFT JOIN 而不是嵌套的 INNER JOIN 進行多對多關聯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM