Как мне объединить две таблицы с помощью Sequelize? - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть 3 таблицы: книги авторов и авторов.Последний, чтобы решить многие ко многим.Пока мне удалось заставить таблицы работать и отображать, как я ожидал.Теперь я хочу отобразить таблицу, которая показывает данные из обеих таблиц: Книги и Авторы.BooksAuthors хранит только идентификаторы других таблиц.Я хочу, чтобы что-то подобное работало с sequelize:

SELECT ab.idA, ab.idB, a.firstName, a.lastName, b.title, b.description
from authorbooks ab
left join authors a on ab.idA=a.idA
left join books b on ab.idB=b.idB;

Вот как я пытался определить отношения.Я думаю, что я что-то здесь упускаю.

db.models.Books = require("../models/books")(sequelize);
  db.models.Authors = require("../models/authors")(sequelize);
  db.models.AuthorBooks = require("../models/authorbooks")(sequelize);


db.models.Authors.belongsToMany(db.models.Books,{
    through: db.models.AuthorBooks,
    foreignKey:{ name: 'idA',
    allowNull:true
  }
  })
  db.models.Books.belongsToMany(db.models.Authors,{
    through: db.models.AuthorBooks,
    foreignKey:{ name: 'idB',
    allowNull: true
  }
  });

  module.exports = db;

Вот как я определил таблицы.КНИГИ:

    module.exports = (sequelize) => {

  class Books extends Sequelize.Model {}


  Books = sequelize.define('Books', {
    idB:{
      type: Sequelize.INTEGER,
      allowNull: false,
      primaryKey : true

  },
  title: {
      type: Sequelize.STRING
  },
  description:{ 
      type: Sequelize.STRING(6000)
  },
  });


  return Books;
};

АВТОРЫ:

         module.exports = (sequelize) => {

      class Authors extends Sequelize.Model {}


      Authors = sequelize.define('Authors', {
        idA:{
          type: Sequelize.INTEGER,
          allowNull: false,
          primaryKey : true

      },
      firstName: {
          type: Sequelize.STRING
      },
      lastName:{ 
          type: Sequelize.STRING
      },
      });


      return Authors;
  };

АВТОРЫ:

module.exports = (sequelize) => {


    class AuthorBooks extends Sequelize.Model {}

    AuthorBooks.init({

      id: {
        type: Sequelize.INTEGER,
        primaryKey:true,
        autoIncrement: true
      }

    },{sequelize});


  return AuthorBooks;
}

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Я думаю, что вы можете использовать опцию «включить» для достижения этой функции.Например, вы можете использовать код, подобный

Book.findAll({
include:[{model:Author}]
})

Эта опция добавит поле «Автор», включающее информацию об авторе к результату.

0 голосов
/ 29 сентября 2019

Вам нужны сквозные параметры в запросе, они объединяют всех авторов, связанных с определенной книгой, пустые атрибуты не добавят ни одного атрибута из таблицы сопоставления, которая в вашем случае называется «Авторские книги».

Book.findAll({
    include:[{
        model:Author,
        through: {
            attributes: []
           }
    }]
})
...