Sequelize 关联和查询此 mysql 查询

Posted

技术标签:

【中文标题】Sequelize 关联和查询此 mysql 查询【英文标题】:Sequelize associate and query for this mysql query 【发布时间】:2022-01-22 04:37:52 【问题描述】:

我只想在 sequelize 中执行这个简单的 mysql 查询,但这真的很混乱..

SELECT *,
       (SELECT COUNT(*)
         FROM  user_review_like
        WHERE  user_review_like.review_id = review.id)
FROM  reviews

所以我就这样尝试了。

const reviewList = await Review.findAndCountAll(
  attributes: ['*', fn('COUNT', col('user_review_like'))],
  include: [
    
      model: UserReviewLike,
      attributes: [],
    ,
  ],
  where,
  raw: true,
  offset: offset,
  limit: 5,
  order,
);

但它说'userReviewLike 与评论无关!'

模型“审查”:

static associate(db) 
  db.Review.belongsTo(db.User); --> for matching review writer and users
  db.Review.belongsToMany(db.User, through: 'user_review_like', foreignKey: 'review_id');

模型“用户”:

static associate(db) 
  db.User.hasMany(db.Review);
  db.User.belongsToMany(db.Review, through: 'user_review_like', foreignKey: 'user_id');

模型'userReviewLike':


    user_id: 
    ,
    review_id: 
    ,
  ,
static associate(db) 
db.UserReviewLike.belongsTo(db.User, 
  foreignKey: 'user_id'
);
db.UserReviewLike.belongsTo(db.Review, 
  foreignKey: 'review_id'
);

这似乎更方便,因为我正在动态设置位置和顺序, 但我对连接查询感到困惑。

请给点建议

谢谢

【问题讨论】:

【参考方案1】:

为了能够在include 中显式指示连接模型,您还应该显式定义从ReviewUserReviewLike 的关联:

db.Review.hasMany(db.UserReviewLike,  foreignKey: 'review_id' )

我想能够使用COUNT 作为子查询你需要使用Sequelize.literal,否则你会得到类似SELECT *, COUNT(*) ...的东西

const reviewList = await Review.findAndCountAll(
  attributes:  include: [
    [literal('(SELECT COUNT(*)
         FROM  user_review_like
        WHERE  user_review_like.review_id = review.id)'), 'like_count']
  ]
  ,
  where,
  raw: true,
  offset: offset,
  limit: 5,
  order,
);

【讨论】:

以上是关于Sequelize 关联和查询此 mysql 查询的主要内容,如果未能解决你的问题,请参考以下文章

sequelize 是不是可以通过关联表中的属性过滤查询?

如何在 Sequelize 中对 belongsToMany 关联进行***查询?

Sequelize 关联模型查询

在 sequelize 中查询 where 关联?

如何使用nodejs sequelize执行此SQL查询?

查询联结表而不在 Sequelize 中获取两个关联