node.js - findall 多对多 Sequelize

标签 node.js orm sequelize.js backend

我有一个包含许多人表和列表的列表。我需要进行包含关系表的查询,例如:

选择 p.id, pl.id

FROM people p 内连接 peopletolists pl

哪里 p.id == pl.id

我的模型:
列出模型:

'use strict';
module.exports = (sequelize, DataTypes) => {
  const lists = sequelize.define('lists', {
    listId: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    nome: DataTypes.STRING(50),
    status: DataTypes.STRING(1),
    parametros: DataTypes.STRING(500)
  }, {
    timestamps: false,
  });

  lists.associate = function(models) {
    lists.belongsToMany(models.people, { 
      through: models.peopletolists, 
      foreignKey: 'listId',
    });
  }

  return lists;
};

人物模型:
'use strict';
module.exports = (sequelize, DataTypes) => {
  const people = sequelize.define('people', {
    peopleId: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    cpf: DataTypes.STRING(11),
    name: DataTypes.STRING(50),
    city: DataTypes.STRING(50),
  }, {
      timestamps: false
    });
  people.associate = function (models) {
    people.belongsToMany(models.lists, { 
      through: models.peopletolists, 
      foreignKey: 'peopleId' 
    });
  }

  return people;
};

N:M 型号:
'use strict';
module.exports = function (sequelize, DataTypes) {
  const peopletolists = sequelize.define("peopletolists", {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      allowNull: false,
      autoIncrement: true,
      unique: true,
    },
    listId: {
      type: DataTypes.INTEGER,
      references: {
        model: 'lists',
        key: 'listId'
      },
      allowNull: false
    },
    peopleId: {
      type: DataTypes.INTEGER,
      references: {
        model: 'people',
        key: 'peopleId'
      },
      allowNull: false
    }
  }, {
    timestamps: false
  });

  return peopletolists;
}

询问:
router.get('/', function (req, res, next) {
    model.lists.findAll({
        include: [{
            model: model.peopletolists,
        }]
    })
        .then(lists => res.json({
            data: lists,
        }))
        .catch(err => res.json({
            error: err,
        }))
});

错误:SequelizeEagerLoadingError

一个人有很多列表,列表有很多人。我在 Sequelize 文档中没有发现很多东西,也没有多少人提示这个错误,它通常在 ClassMethods 上,但我什至没有使用它。

怎么了?

最佳答案

这就是我使用它的方式。

ArtistModel.findAll({
    where: {
      slug: req.params.slug
    }, attributes: ['id']
    , include: [{
      model: Genres,
      as: 'ArtistGenre',
      required: false,
      // attributes: ['id'],
      through: {attributes: []},
    }],
    subQuery: false,
    limit: req.query.limit,
    offset: req.skip
  })

其中 Genre 是通过 ArtistGenre 以多对多关系与 Artist 表链接的表

艺术家类型模型:
const db = require('../utils/connection');
const Sequelize = require('sequelize');

let ArtistGenre = db.define('artist_genre', {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  }
}, {
  timestamps: false,
  underscored: true
});

ArtistGenre.removeAttribute('id');

module.exports = ArtistGenre;

艺术家:
const db = require('../utils/connection');
const Sequelize = require('sequelize');

module.exports = db.define('artist', {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  name: {
    type: Sequelize.STRING
  },
  status: {
    type: Sequelize.ENUM,
    values: ['active', 'inactive'],
    defaultValue: 'active'
  },
  created_at: {
    type: 'TIMESTAMP',
    defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
    allowNull: false
  },
  updated_at: {
    type: 'TIMESTAMP',
    defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
    allowNull: false
  }
}, {
  underscored: true,
  timestamps: false
});

流派型号:
const db = require('../utils/connection');
const Sequelize = require('sequelize');

module.exports = db.define('genre', {
  id: {
    type: Sequelize.BIGINT(20),
    primaryKey: true,
    autoIncrement: true
  },
  name: {
    type: Sequelize.STRING
  }
}, {
  timestamps: false
});

关联如下所示:
Artist.belongsToMany(models.genre, {as: 'ArtistGenre', through: 'artist_genre', foreignKey: 'artist_id', otherKey: 'genre_id'});
Genre.belongsToMany(models.artist, {as: 'ArtistGenre', through: 'artist_genre', foreignKey: 'genre_id', otherKey: 'artist_id'});

关于node.js - findall 多对多 Sequelize ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53867618/

相关文章:

javascript - 如何防止 gulp-notify 在 Windows 中破坏 gulp-watch?

php - Eloquent ORM 条件模型关系

python - 您可以推荐哪种适用于 python 的 ldap 对象映射器?

node.js - Sequelize 中的多对一关联

ruby-on-rails - 在 Rails 上使用react - ! [远程拒绝] master -> master(预接收 Hook 被拒绝)

javascript - 使用 Express JS 阻止来自客户端的不需要的请求

arrays - 将数组添加到 MongoDB/Mongoose 集合时出错

java - 运行 find 会抛出一个 Detached 实体传递给持久异常

javascript - Sequelize 播种机问题

node.js - 按日期范围查询 Sequelize 中的列字段