найти все, чтобы многие продолжение - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть список из множества таблиц и списков людей.Мне нужно сделать запрос, который включает в себя таблицу отношений, что-то вроде:

SELECT p.id, pl.id

ИЗ людей p внутреннее объединение списков людей 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, но я даже не использую ее.

Что не так?

1 Ответ

0 голосов
/ 22 декабря 2018

Вот как я его использую.

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 - это таблица, которая связана с таблицей Artist с отношением «многие ко многим» через ArtistGenre

ArtistGenre Model:

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'});
...