我对sequelize最大的痛苦之一就是对关联进行基本上“分页和计数”。
使用findAndCountAll
对于一次性模型来说相当简单,对于has-many来说有点痛苦,但完全不可能与多对多一起使用。
作为一个例子,我建立了这种多对多关联,用户可以属于许多组:
const UserGroup = db.define('user_groups', {
})
User.belongsToMany(Group, {through: UserGroup})
Group.belongsToMany(User, {through: UserGroup})
从群组中获取所有用户都很简单:
user.getGroups().then....
但是将其移植到findAndCountAll
似乎没有相同的方式:
User.findAndCountAll({
include: [{model: Group,
through: UserGroup,
where: { groupId : group.id,
userId : {$ne: user.id}}
}],
limit: limit,
offset: offset, ...
这不起作用,因为它将where子句中的键与Group
模型相关联。
我也尝试过:
User.findAndCountAll({
include: [{model: Group,
include: {
model: UserGroup,
where: { groupId : group.id,
userId : {$ne: user.id}}}
}],
limit: limit,
offset: offset, ...
但它也失败了Error: user_groups is not associated to groups!
,这不是真的。
有没有一种干净的方法可以做到这一点,最好是使用辅助方法?
答案 0 :(得分:2)
我早些时候遇到了这个问题,所以我决定以这种方式更改功能...
//sort in descending order (time), pick first 2 entries
$options = ['sort' => ['Time' => -1], 'limit' => 2];
$filter=[];
$cursor = $collection->find($filter, $options);
//get the latest entry (biggest unix timestamp)
$largest = 0;
foreach($cursor as $document){
if ($largest < $document["Time"]) {
$largest = $document["Time"];
$longitude = $document["Longitude"];
$latitude = $document["Latitude"];
}
答案 1 :(得分:1)
我担心在急切加载关联时(或者至少当你还想为关联添加一些条件时)不可能使用findAndCountAll
方法。在您的情况下,没有选项可以使用user.getGroups()
。
虽然您可以使用Sequelize的简写方法来计算关联实例,在您的情况下,user.countGroups()
在返回user.getGroups()
之前。如果您想要获取具有某些条件的相关组,只需将它们作为getGroups()
方法参数传递(它采用与标准findAll
相同的选项参数)