Sequelize具有相同外键的多对多表只选择一个值

时间:2016-11-22 14:49:07

标签: mysql node.js sequelize.js

我有以下结构:

var User = sequelize.define('user', {
  name: DataTypes.STRING
});

var Post = sequelize.define('post', {
  text: DataTypes.STRING
});

var PostComment = sequelize.define('postComment ', {
  id: {
    type: DataTypes.BIGINT,
    primaryKey: true,
    autoIncrement: true
  },
  comment: DataTypes.TEXT
});

Post.belongsToMany(User, {as: 'postUserComment', through: {model: models.PostComment, unique: false}, foreignKey: 'idPost'});

User.belongsToMany(Post, {through: {model: models.PostComment, unique: false}, foreignKey: 'idUserComment'});

我可以使用用户为同一帖子创建多个评论。

但是如果我对同一个帖子的同一个用户有多个评论,并尝试通过以下方式选择它们:

 Post.findAll({
          include: [{model: models.User, as: 'postUserComment', attributes:['name'], through: {attributes: ['comment']}},
          limit: 10,
          offset: 0,
          order: "id DESC"
...

它只是为帖子中的每个用户返回1条评论。我该怎样做才能全部选择它们?

方言:mysql, 续集版:~3.27.0

1 个答案:

答案 0 :(得分:2)

在Sequelize中,与BelongsToMany和相同ID有关联在某种程度上是棘手的。

正如您已经在GitHub #6906及其他相关问题中已经注意到的那样,最好的方法是用不同的关系缓解它。

例如,您可以添加:

Post.hasMany( models.PostComment, { foreignKey: 'idPost' } );

然后是您的查询

Post.findAll({
      include: [
        {model: models.User, as: 'postUserComment', attributes:['name'], through: {attributes: ['comment']}},
        {model : models.PostComment}
      ],
      limit: 10,
      offset: 0,
      order: "id DESC"
      ..

这不会改变您的数据库结构,并且会产生您想要的效果。