我有一个歌手实体和一个相关的歌曲实体
歌手实体
export class Singer {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany( type => Song, Song => Song.user )
songs: Song[];
}
歌曲实体
export class Song {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToOne( type => Singer, Singer => Singer.songs )
singer: Singer;
}
我想让所有Songs
按Singer
名称排序
我搜索了docs和github问题,但找不到答案
我该如何解决?没有QueryBuilder
答案 0 :(得分:2)
我遇到了同样的问题,我尝试按自定义列排序但没有查询构建器,因为我使用的是存储库,这是我的解决方案:
let res = await this.trackingRepository.findAndCount({
where: `username like '%${seachValue}%' or action like '%${seachValue}%' or ip like '%${seachValue}%'`,
order: {
[sortField]: sortOrder === "descend" ? 'DESC' : 'ASC',
},
skip: (current - 1) * pageSize,
take: pageSize,
});
答案 1 :(得分:1)
答案 2 :(得分:1)
如果您愿意通过将任务委托给lodash之类的库来在内存中进行订购,则不必使用查询生成器。
这样,您仍然可以使用EntityManager
或Repository
来查询数据。
// first fetch the song and include (=join) the
// singer by the foreign key "singer"
var queryResult = await this.entityManager.find(Song, {
relations: ['singer'],
});
// then use a library like lodash to do the ordering
const songsSortedBySinger = _.orderBy(queryResult, song => song.singer.name);
进一步阅读:
relations
的查找选项是documented here。答案 3 :(得分:1)
如果结果不是太大,您可以使用实体挂钩解决方法:
@AfterLoad()
sortItems() {
if (this?.sortableItems?.length) {
this.sortableItems.sort((a, b) => a.weight - b.weight);
}
}
答案 4 :(得分:1)
我认为 typeorm 增加了对这个功能的支持。在我的代码库中,我使用了这样的语法,它根据 singer.name
对结果进行排序。
const queryResult = await this.songRepository.find(Song, {
relations: ['singer'],
order: {
'singer.name': 'ASC',
},
});
答案 5 :(得分:-1)
当您使用存储库时:
var queryResult = await this.youRepository.find(Song, {
relations: ['singer'],
order: {
name: 'ASC',
},
});