使用Sequelize计算关联模型

时间:2017-07-20 19:03:17

标签: mysql node.js sequelize.js

我正在尝试构建一个留言板来自学JavaScript。我正在使用:

  • 的NodeJS
  • angularjs
  • 表示
  • MySQL的

我有一个视图/board,它使用以下路由(以及相应的sqlize查询)来获取显示“board index”的数据:

router.get('/api/board/fetch', function(req, res) {
    if(req.session.key) {
      dbconn.threads.findAll({ 
        order: 'id DESC',
        include: [{
          model: dbconn.users,
          attributes: ['id', 'username', 'first_name']
        }]
      }).then(function(threads) {
        return res.send({ success: true, threads: threads }); // return all threads found in table

      });
    } else {
      return res.send({ success: false, msg: 'Error: Posts' })
    }

  });

上面的示例只是使用一些关联的模型数据获取线程以显示摘要索引。现在,为了也显示特定线程中的当前“帖子计数”,我将sqlize修改为:

router.get('/api/board/fetch', function(req, res) {
    if(req.session.key) {
      dbconn.threads.findAll({ 
        order: 'threads.id DESC',
        group: ['threads.id', 'replies.id'],
        raw: true,
        include: [{
          model: dbconn.users,
          attributes: ['id', 'username', 'first_name'],
        }, {
          model: dbconn.replies,
          attributes: [[sequelize.fn('COUNT', 'id'), 'replyCount']],
        }]
      }).then(function(threads) {
        return res.send({ success: true, threads: threads }); // return all threads found in table

      });
    } else {
      return res.send({ success: false, msg: 'Error: Posts' })
    }

  });

我使用this SO questionthis GH issue将它拼凑在一起,而不是输出:

  

主题标题| #回复

它列出相同的数据5次,所有这些数据的“#Reslies”为0。我相信正在发生的事情:

  • 我没有准确计算replies.id ='x'
  • 的所有threadId
  • 我没有正确实现sequelize.fn(“COUNT”)...语法

为了更好的背景(希望如此),我的控制器中有以下内容:

board.fetch().then(function(data) {
      $scope.thread = data
      console.log("data obj -> ", data)
    })

使用我的service.js中的以下内容:

fetch : function() {
      return $http.get('/api/board/fetch').then(function(response) {
        return response.data
      })
    },

在浏览器中,对象可以理解地在threads数组中有五个对象,它们都包含相同的数据(从sqlize查询中有意义)和replies.replyCount: 1

我为可怕的代码,命名约定道歉,如果在其他地方得到解答的话。我今天花了一些时间试图解决这个问题,但由于我缺乏理解来寻找正确的问题,因此我受到了限制。

如果有必要,我可以提供模型定义;这个帖子已经感觉很久了。

更新 根据{{​​3}}的观察修改了代码,它现在可以正常工作。更新了以下代码:

dbconn.threads.findAll({ 
        order: 'threads.id DESC',
        raw: true,
        attributes: {
          include: ['title', 'body', 'slug', 'createdAt', 'userId', [sequelize.fn('COUNT', 'replies.id'), 'replyCount']]
        }, 
        include: [{
          model: dbconn.users,
        }, {
          model: dbconn.replies, attributes: [],
        }],
        group: ['threads.id', 'replies.threadId'],
      }).then(function(threads) {
        return res.send({ success: true, threads: threads }); // return all threads found in table

      });
    } else {
      return res.send({ success: false, msg: 'Error: Posts' })
    }

0 个答案:

没有答案