Sequelize Join с количеством совпадающих идентификаторов - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть две модели, 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"]
})

Редактировать: По запросу, вот моя модель defs.

Сообщение:

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;
};

PostLike:

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;
};

1 Ответ

0 голосов
/ 03 апреля 2020

Так что, похоже, что-то не так с этой настройкой, я никогда не настраивал свои ассоциации таким образом (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;
  };

После вставки одного поста и двух лайков, это результат: enter image description here

...