javascript - Sequelize Join 与匹配 id 的计数

标签 javascript node.js postgresql sequelize.js

我有两个模型,Post 和 PostLikes,其中 PostLikes.postId 引用 Post.id。我正在尝试运行 Post.findAll({}) 其中 PostLike.postId = Post.id。我尝试了很多很多东西,但一直无法到达任何地方。这是我上次尝试的,它显示了来自 Post 的所有信息,但 LikeCount 为 0。

await Post.findAll({
    attributes: [
      "id",
      "username",
      "title",
      "body",
      "createdAt",
      "updatedAt",
      [sequelize.fn("COUNT", sequelize.col("PostLikes.postId")), "LikeCount"]
    ],
    include: [
      {
        model: PostLike,
        attributes: []
      }
    ],
    group: ["Post.id"]
})

编辑:根据要求,这是我的模型定义。

邮政:
module.exports = (sequelize, DataTypes) => {
  const Post = sequelize.define(
    "Post",
    {
      title: DataTypes.STRING,
      body: DataTypes.TEXT,
      userId: DataTypes.INTEGER,
      username: DataTypes.STRING
    },
    {}
  );
  Post.associate = function(models) {
    Post.belongsTo(models.User, {
      foreignKey: "username",
      onDelete: "cascade"
    });
    Post.belongsTo(models.User, {
      foreignKey: "userId",
      onDelete: "cascade"
    });
    Post.hasMany(models.Comment, { foreignKey: "id" });
    Post.hasMany(models.PostLike, { foreignKey: "id" });
  };
  return Post;
};

帖子喜欢:
module.exports = (sequelize, DataTypes) => {
  const PostLike = sequelize.define(
    "PostLike",
    {
      liked: DataTypes.BOOLEAN,
      userId: DataTypes.INTEGER,
      postId: DataTypes.INTEGER
    },
    {}
  );
  PostLike.associate = function(models) {
    PostLike.belongsTo(models.Post, {
      foreignKey: "postId",
      onDelete: "cascade"
    });
    PostLike.belongsTo(models.User, {
      foreignKey: "userId",
      onDelete: "cascade"
    });
  };
  return PostLike;
};

最佳答案

所以这个设置似乎有问题,我从来没有这样设置我的关联( Sequelize 非常困惑,文档似乎与他们的例子不一致),所以很难说。但是我玩过你的模型,当我尝试添加多个 PostLike 时,我遇到了一些约束错误。我对其进行了一些更改,并使其正常工作(我删除了用户引用,因为它们与此处的问题无关):

  module.exports = (sequelize, DataTypes) => {
        const Post = sequelize.define(
            "Post",
            {
                title: DataTypes.STRING,
                body: DataTypes.TEXT,
                userId: DataTypes.INTEGER,
                username: DataTypes.STRING
            },
            {}
        );
        Post.associate = function (models) {


            Post.hasMany(models.PostLike);
        };


        return Post;
    };



  module.exports = (sequelize, DataTypes) => {
    const PostLike = sequelize.define(
        "PostLike",
        {
          liked: DataTypes.BOOLEAN,
          userId: DataTypes.INTEGER,         
        },
        {}
      );
      PostLike.associate = function(models) {//
        PostLike.belongsTo(models.Post);        
      }; 

    return PostLike;
  };

插入一个帖子和两个 postLike 后,结果如下:
enter image description here

关于javascript - Sequelize Join 与匹配 id 的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61017135/

相关文章:

javascript - 为什么 jQuery .attr 总是说这是未定义的?

javascript - 除了 p 标签之外,从 JavaScript 中的文本中去除 Html?

javascript - 禁用单选按钮的CSS

javascript - 使用 tedious(Node.js) 执行 SQL 查询

node.js - Superagent 与实际浏览器共享 session /cookie 信息

postgresql - Postgres hstore 是否支持每个元素的原子更新?

sql - 如何在 PostgreSQL 中加快查询速度

javascript - 我如何检查一个字符串在 JavaScript 中是否全部大写?

ios - TCP Keep-Alive 是双向的吗?

ruby-on-rails - Rails 扩展领域与范围,PG 不喜欢它