sequelize.js,计算相关项目的数量

时间:2013-12-05 22:01:30

标签: sequelize.js

我只想获得相关项目的数量。这符合您的期望:

var options = { 
  where: { 
    username: { like: '%' + q + '%'}}, 
    include: [Transaction]
  }};

User.findAll(options).success(function (users) {
  res.json(users);
});

但是为了获得计数,我必须遍历每个用户,计算事务数量,获取dataValues,并手动修改dataValues对象的新属性(transactionCount)。

我觉得应该有一个更清洁的方式来做这个(可能使用伪属性?),但答案是逃避我。有什么建议?

2 个答案:

答案 0 :(得分:-1)

怎么样:

var options = { 
  where: { 
    username: { like: '%' + q + '%'}}, 
    include: [Transaction]
  }};

User.findandCountAll(options).success(function (users) {
  res.json(users);
});

详细信息:http://sequelizejs.com/documentation#models-finders

答案 1 :(得分:-2)

在只有一个关联模型的情况下,我能够遍历每个用户,计算关联的事务,然后将用户数据值复制到一个单独的数组中并将其发送到客户端。

var values = [],
    i;

 for (i = 0; i < users.length; i++) {
  var user = users[i],
      userValues = users[i].dataValues;
   if (userValues.hasOwnProperty('username')) {
    userValues.transactions = (!!user.transactions) ? user.transactions.length : 0;
    values.push(userValues);
  }
}

如果需要对两个关联模型进行计数,我最终使用原始SQL来获取交易和帐户的计数。然后我使用类似于上面的东西手动将值添加到基本模型。 注意:您需要重命名查询中的字段,否则Sequelize将以不友好的方式解释句点(。)并指定名称为COUNT(Tid)的属性。

var query = 'SELECT A.id AS id, ' +
  'COUNT(T.id) AS transactions, ' +
  'COUNT(DISTINCT U.username) AS users ' +
  'FROM Users U, Transactions T, Accounts A ' +
  'WHERE U.accountId = A.id ' +
  'AND T.username = U.username ' +
  'AND U.accountId IN (' + ids.join(',') + ') ' +
  'GROUP BY U.username';