Удивительная проблема в ассоциациях «многие ко многим», использующих Sequelize - PullRequest
1 голос
/ 02 марта 2020

Я создал три таблицы posts, tags и post_tags. Каждая запись принадлежит многим тегам через PostTag, и каждая запись принадлежит многим тегам через PostTag. Удивительная проблема заключается в том, что, когда я сортирую posts.id как DESC, теги будут пустыми, а результат запроса на соединение не вернет ни одного тега. но когда я сортирую id как ASC, теги будут показаны в результате JSON. Некоторые из сообщений не имеют тега. Я не знаю, почему эта проблема существует. Если знание типа базы данных помогает решить проблему, я использую Postgresql.

Структуры моделей:

// Posts Model
const posts = (sequelize, DataTypes) => {
  const posts = sequelize.define(
    "posts",
    {
      userId: DataTypes.INTEGER,
      title: DataTypes.STRING,
    },
    {
      tableName: "posts",
      timestamps: true,
      paranoid: true
    }
  );

  // Relations
  posts.associate = (models) => {
    posts.belongsToMany(models.tags, {
      through: 'postTags',
      as: 'tags',
      foreignKey: 'postId',
      otherKey: 'tagId'
    });
  }

  return posts;
};

// Tags Model
const tags = sequelize.define(
    "tags",
    {
      title: DataTypes.STRING
    },
    {
      tableName: "tags",
      timestamps: true,
      paranoid: true
    }
  );

  // Relations
  tags.associate = (models) => {
    tags.belongsToMany(models.posts, {
      through: 'postTags',
      as: 'posts',
      foreignKey: 'tagId',
      otherKey: 'postId'
    });
  }

  return tags;
};

// PostTags Model
const post_tags = (sequelize, DataTypes) => {
  const post_tags = sequelize.define(
    "postTags",
    {
      postId: DataTypes.INTEGER,
      tagId: DataTypes.INTEGER
    },
    {
      tableName: "post_tags",
      timestamps: true,
      paranoid: true
    }
  );

  return post_tags;
};

И я выбрал строки по этим параметрам:

const posts = models.posts.findAll({
   attributes: [
     'id',
     'title'
   ],
   include: [
      {
         model: models.tags,
         as: 'tags',
         required: false,
         attributes: [
            'id',
            'title'
         ],
         through: {
            model: models.postTags,
            as: 'postTags',
            attributes: [
               'postId',
               'tagId'
            ]
         }
       }
   ],
   order: [['id', 'desc']]
 });

1 Ответ

1 голос
/ 02 марта 2020

Вы записываете свои запросы на продолжение? У меня никогда не было с этим проблем, но вы можете получить что-то, чего не ожидаете в своем запросе ... вставьте их в свой вопрос, если вы их зарегистрируете ...

...