SequelizeEagerLoadingError, не может получить данные с помощью include - PullRequest
0 голосов
/ 15 октября 2018

Я использую Sequelize.js для отправки запросов в базу данных.У меня есть отношение многие ко многим между двумя таблицами, и я создал третью соединительную таблицу.Вот мои три стола.polit_in_article - это таблица соединений.

politician.js:

module.exports = (sequelize, DataTypes) => {
    const Politician = sequelize.define('politician', {
        ...
    });

    Politician.associate = (models) => {
        Politician.hasMany(models.Polit_in_article, {
            foreignKey: 'politicianId',
            as: 'polit_in_articles',
        });
    };

    return Politician;
};

article.js:

module.exports = (sequelize, DataTypes) => {
    const Article = sequelize.define('article', {
        ...
    });

    Article.associate = (models) => {
        Article.hasMany(models.Politician, {
            foreignKey: 'articleId',
            as: 'polit_in_articles'
        });
    };
    return Article;
};

polit_in_article.js:

module.exports = (sequelize, DataTypes) => {
    const Polit_in_article = sequelize.define('polit_in_article', {
        times_mentioned: DataTypes.INTEGER,
    });
    Polit_in_article.associate = (models) => {
        Polit_in_article.belongsTo(models.Article, {
            // foreignKey: 'articleId',
            as: 'articles',
        });
        Polit_in_article.belongsTo(models.Politician, {
            // foreignKey: 'politicianId',
            as: 'politicians',
        });
    };

    return Polit_in_article;
};

А вот мой контроллер (не уверен, что это правильный способ вызова):

const Sequelize = require('sequelize');

const Article = require('../models').Article;
const Politician = require('../models').Politician;
const Polit_in_article = require('../models').Polit_in_article;

const Op = Sequelize.Op;

module.exports = {
    getAllArticlesOfPolitician(req) {
        return Article
            .findAll({
                include: [{
                    model: Polit_in_article,
                    include: [{
                        model: Politician,
                        where: {
                            lastname: req.query.politicianLastName,
                        }
                    }],
                }],
            }).then(response => response)
            // .catch(err => err);
    }
};

, и с этим я получаю ошибку SequelizeEagerLoadingError: polit_in_article is not associated to article.Возможно, я что-то пропустил, но я действительно не знаю, что здесь делать.Я попытался сделать таблицу статей для связи as: 'polit_in_articles', которая работала до тех пор, пока мне не нужно было включить в запрос табели политиков.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Мне просто нужно было исправить связь в article.js, я связался с политиком вместо таблицы соединений:

module.exports = (sequelize, DataTypes) => {

    const Article = sequelize.define('article', {
         ...
    });

    Article.associate = (models) => {
        Article.hasMany(models.Polit_in_article, {
            foreignKey: 'articleId',
            as: 'polit_in_articles'
        });
    };
    return Article;
};
0 голосов
/ 16 октября 2018

Вам необходимо использовать ключевое слово through в своих ассоциациях.Articles будет иметь politicians through модель Polit_in_article, однако, поскольку вы просто используете первичные ключи на нем, вы можете разрешить ее вывод и опустить polit_in_article.js и просто использовать строку для именования таблицы.

Politician.associate = (models) => {
  Politician.hasMany(models.Article, {
    foreignKey: 'politicianId',
    through: 'polit_in_article',
    as: 'articles',
  });
};

Article.associate = (models) => {
  Article.hasMany(models.Politician, {
    foreignKey: 'articleId',
    through: 'polit_in_article',
    as: 'politicians',
  });
};

Теперь вы можете выполнять запросы через таблицу соединений, указав as и through.

getAllArticlesOfPolitician(req) {
  return Article.findAll({
    include: [{
      model: Politician,
      as: 'politicians',
      through: 'polit_in_article',
      where: {
        lastname: req.query.politicianLastName,
      },
    }],
  })
  .then(response => response)
  .catch(err => err);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...