我只想获得相关项目的数量。这符合您的期望:
var options = {
where: {
username: { like: '%' + q + '%'}},
include: [Transaction]
}};
User.findAll(options).success(function (users) {
res.json(users);
});
但是为了获得计数,我必须遍历每个用户,计算事务数量,获取dataValues,并手动修改dataValues对象的新属性(transactionCount)。
我觉得应该有一个更清洁的方式来做这个(可能使用伪属性?),但答案是逃避我。有什么建议?
答案 0 :(得分:-1)
怎么样:
var options = {
where: {
username: { like: '%' + q + '%'}},
include: [Transaction]
}};
User.findandCountAll(options).success(function (users) {
res.json(users);
});
答案 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(T
和id)
的属性。
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';