使用bookshelfjs通过相关的表格列来sorting结果

我有两个表,我正在使用'withRelated'与bookshelfjs查询。 如何按相关表中的列对结果进行sorting? 例如,我想通过rankingLinks.id来排列所有的结果

 .fetchAll({withRelated: ['tickerSymbolLinks.tickerSymbol', 'rankingLinks', 'logoLinks.logo']}) 

看起来很简单,但把我的头撞在了墙上。

实际上你可以用相关的东西来withRelated ,但是它只会在这个特定的属性中sorting结果。 即:

 new Participant().query(function(qb) { qb.orderBy('participants.id', 'desc'); // You don't have access to any "withRelated" models }).fetchAll({ withRelated: [{ 'courses': function(qb) { qb.orderBy('courses.id', 'desc'); } }] }).then(function(result) { res.json(result.toJSON()); }); 

这个代码返回所有参与者,按他们的id(降序)sorting。 在这个结果中,我通过courses.id desc命令课程。 结果如下:

 [ { "id": 3, "name": "Susan Doe", "created_at": 1429685077496, "updated_at": 1429685077496, "courses": [ { "id": 3, "course_name": "Advanced JavaScript", "duration": 80, "_pivot_participant_id": 3, "_pivot_course_id": 3, "_pivot_level": null, "_pivot_grade": null, "_pivot_date_of_attendance": null }, { "id": 1, "course_name": "iOS development", "duration": 120, "_pivot_participant_id": 3, "_pivot_course_id": 1, "_pivot_level": null, "_pivot_grade": null, "_pivot_date_of_attendance": null } ] }, { "id": 2, "name": "Richard Doe", "created_at": 1429685077496, "updated_at": 1429685077496, "courses": [ { "id": 2, "course_name": "Android development", "duration": 60, "_pivot_participant_id": 2, "_pivot_course_id": 2, "_pivot_level": null, "_pivot_grade": null, "_pivot_date_of_attendance": null }, { "id": 1, "course_name": "iOS development", "duration": 120, "_pivot_participant_id": 2, "_pivot_course_id": 1, "_pivot_level": null, "_pivot_grade": null, "_pivot_date_of_attendance": null } ] }, { "id": 1, "name": "John Doe", "created_at": 1429685077495, "updated_at": 1429685077495, "courses": [ { "id": 3, "course_name": "Advanced JavaScript", "duration": 80, "_pivot_participant_id": 1, "_pivot_course_id": 3, "_pivot_level": null, "_pivot_grade": null, "_pivot_date_of_attendance": null }, { "id": 1, "course_name": "iOS development", "duration": 120, "_pivot_participant_id": 1, "_pivot_course_id": 1, "_pivot_level": null, "_pivot_grade": null, "_pivot_date_of_attendance": null } ] } ] 

现在,如果我想按课程排列结果,我不得不改变一下查询。 即:

 new Course().query(function(qb) { qb.orderBy('courses.id', 'desc'); }).fetchAll({ withRelated: ['participants'] }).then(function(result) { res.json(result.toJSON()); }); 

这产生了一个稍微不同的结果,但是按照期望的顺序:

 [ { "id": 3, "course_name": "Advanced JavaScript", "duration": 80, "participants": [ { "id": 1, "name": "John Doe", "created_at": 1429685077495, "updated_at": 1429685077495, "_pivot_course_id": 3, "_pivot_participant_id": 1, "_pivot_level": null, "_pivot_grade": null, "_pivot_date_of_attendance": null }, { "id": 3, "name": "Susan Doe", "created_at": 1429685077496, "updated_at": 1429685077496, "_pivot_course_id": 3, "_pivot_participant_id": 3, "_pivot_level": null, "_pivot_grade": null, "_pivot_date_of_attendance": null } ] }, { "id": 2, "course_name": "Android development", "duration": 60, "participants": [ { "id": 2, "name": "Richard Doe", "created_at": 1429685077496, "updated_at": 1429685077496, "_pivot_course_id": 2, "_pivot_participant_id": 2, "_pivot_level": null, "_pivot_grade": null, "_pivot_date_of_attendance": null } ] }, { "id": 1, "course_name": "iOS development", "duration": 120, "participants": [ { "id": 1, "name": "John Doe", "created_at": 1429685077495, "updated_at": 1429685077495, "_pivot_course_id": 1, "_pivot_participant_id": 1, "_pivot_level": null, "_pivot_grade": null, "_pivot_date_of_attendance": null }, { "id": 2, "name": "Richard Doe", "created_at": 1429685077496, "updated_at": 1429685077496, "_pivot_course_id": 1, "_pivot_participant_id": 2, "_pivot_level": null, "_pivot_grade": null, "_pivot_date_of_attendance": null }, { "id": 3, "name": "Susan Doe", "created_at": 1429685077496, "updated_at": 1429685077496, "_pivot_course_id": 1, "_pivot_participant_id": 3, "_pivot_level": null, "_pivot_grade": null, "_pivot_date_of_attendance": null } ] } ] 

我希望这个能有一点帮助!