sequelize:如何为关联做相当于findAndCountAll的事情

时间:2017-04-19 10:55:02

标签: orm sequelize.js

我对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!,这不是真的。

有没有一种干净的方法可以做到这一点,最好是使用辅助方法?

2 个答案:

答案 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相同的选项参数)