【问题标题】:Sequelize js get count of associated modelSequelize js获取关联模型的计数
【发布时间】:2015-02-14 08:20:34
【问题描述】:

比如说我有一个discussions 表和replies 表。

如何获取每条讨论记录的回复计数?

Models.course_discussions.count({
    where: { 'course_id': 105 },
    include: [
        {model: Models.course_discussions_replies, as: 'replies'}
    ]
})
.then(function (discussions) {
    if (!discussions) {
        reply(Hapi.error.notFound());
    } else {
        console.log("91283901230912830812 " , discussions);
    }
});

上面的代码转换成下面的查询——

SELECT COUNT(`course_discussions`.`id`) as `count` FROM `course_discussions` LEFT OUTER JOIN `course_discussions_replies` AS `replies` ON `course_discussions`.`id` = `replies`.`discussion_id` WHERE `course_discussions`.`course_id`=105;

上面的代码让我对讨论进行计数。但是如何计算每个讨论的回复数?

下面的sql查询有效,但是sequelize的方式怎么写呢?

SELECT COUNT(  `replies`.`discussion_id` ) AS  `count` 
FROM  `course_discussions` 
LEFT OUTER JOIN  `course_discussions_replies` AS  `replies` ON  `course_discussions`.`id` =  `replies`.`discussion_id` 
WHERE  `course_discussions`.`course_id` =105

【问题讨论】:

    标签: sql sequelize.js


    【解决方案1】:

    如果您需要讨论和回复计数,.replies.length 应该适合您。

    Models.course_discussions.findAll(
      where: { 'course_id': 105 },
      include: [
        {model: Models.course_discussions_replies, as: 'replies'}
      ]
    })
    .then(function (discussions) {
      // each discussion in discussions will have a
      // replies array
    
      discussions[0].repies.length // replies for current discussion
    });
    

    【讨论】:

    • 为了防止数据库做大量工作并返回所有关联的行,您还可以在查询中添加attributes: ['id']
    • 如果需要在计数上添加条件怎么办?例如,找到至少有 2 条回复的所有讨论?
    • let twoRepliesDiscussions = discussions.filter(discussion => discussion.replies.length > 2);
    • 这实际上是一个糟糕的响应,因为它检索所有行以在 JS 中进行计数。最好使用内置的数据库函数。
    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2016-10-24
    • 2017-03-30
    • 2013-10-21
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多