订购Bookshelf.js按相关列值获取

时间:2014-03-21 19:45:49

标签: node.js bookshelf.js knex.js

我使用Bookshelf.js / Knex.js,使用相关的子模型获取模型(称之为用户)(称之为公司)。
我可以按字段订购儿童模特 - company.name

另外,如果可以,我可以进行多重排序,说company.name降序然后lastName升序

这是我当前的代码,仅适用于根模型字段。 qb.orderBy('company.name', 'desc')无效。

users.query(function(qb) {
  qb.orderBy('lastName', 'asc');
})
.fetch({withRelated: ['company']})
.then(success, error);

3 个答案:

答案 0 :(得分:2)

尝试以下方法:

users
.fetch({withRelated: [
     {
         'company': function(qb) {
             qb.orderBy("name");
         }
     }
]})
.then(success, error);

我从https://github.com/tgriesser/bookshelf/issues/361

得到了这个想法

答案 1 :(得分:1)

你可以这样做而不需要功能:

users.query(function(qb) {
  qb.query('orderBy', 'lastName', 'asc');
})
.fetch({withRelated: ['company']})
.then(success, error);

在此处找到:Sort Bookshelf.js results with .orderBy()

答案 2 :(得分:0)

我想通过这样做解决了这个问题:

let postHits =
    await posts
        .query(qb => qb
            .innerJoin('post_actor_rel', function () {
                this.on('post.id', '=', 'post_actor_rel.post_id');
            })
            .innerJoin('actor', function () {
                this.on('post_actor_rel.actor_id', '=', 'actor.id');
            })
            .orderByRaw('actor.name ASC')
            .groupBy('id')
        )
        .fetchPage({
            withRelated: ['roles', 'themes', 'activity_types', 'subjects', 'educational_stages', 'images', 'documents', 'actors'],
            limit,
            offset
        },
    );

我通过内部连接所需的表来修改查询,并在排序之后(使用orderByRaw,因为我需要添加一些我认为不可能使用orderBy的排序)我按 post&group进行分组 id去掉重复的行。唯一的问题是它没有定义哪个 actor 名称(几种可能的)用于排序。