Typescript TypeForm:如何按关系字段排序
我有一个歌手实体和一个相关的歌曲实体 歌手实体Typescript TypeForm:如何按关系字段排序,typescript,typeorm,Typescript,Typeorm,我有一个歌手实体和一个相关的歌曲实体 歌手实体 export class Singer { @PrimaryGeneratedColumn() id: number; @Column() name: string; @OneToMany( type => Song, Song => Song.user ) songs: Song[]; } export class Song { @PrimaryGeneratedCo
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;
}
歌曲实体
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;
}
我想获得所有歌曲
按歌手
姓名排序
我搜索了文档和github问题,但找不到答案
我怎样才能解决这个问题?没有
QueryBuilder更好
如果没有查询生成器,我认为typeorm目前不支持它,目前有一个
但使用QueryBuilder非常简单:
connection.createQueryBuilder(Song, 'songs')
.leftJoinAndSelect('songs.singer', 'singer')
.orderBy('singer.name', 'ASC')
.getMany();
如果您愿意在内存中进行排序,则不必使用查询生成器。(小心:这意味着首先获取所有数据集,然后在节点服务器上执行筛选) 为此,您可以将任务委托给类似的库。这样,您仍然可以使用
EntityManager
或存储库来查询数据
// 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);
进一步阅读:
关系
查找选项为
- 洛达斯的订货人是
使用存储库时:
var queryResult = await this.youRepository.find(Song, {
relations: ['singer'],
order: {
name: 'ASC',
},
});
如果结果不太大,您可以使用带有实体挂钩的变通方法:
@AfterLoad()
sortItems(){
如果(此?.sortableItems?.length){
this.sortableItems.sort((a,b)=>a.weight-b.weight);
}
}
我遇到了与我尝试按自定义列排序相同的问题,但没有查询生成器,因为我使用的是存储库,这是我的解决方案:
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,
});
我认为typeorm增加了对这个特性的支持。在我的代码库中,我使用这样的语法,它根据singer.name
对结果进行排序
const queryResult=wait this.songRepository.find(Song{
关系:[“歌手”],
订单:{
“歌手姓名”:“ASC”,
},
});
如果我能接受两个答案,我也会接受你的答案。这就是我使用的方法,但是你用了一种非常优雅的方式解释了它,谢谢。谢谢@Budget,不用担心:)顺便说一下,其他语言的其他ORM实际上支持你的需求。例如,在C#中,“实体框架”允许您简单地编写songs.OrderBy(song=>song.singer.name)
将自动为您执行联接和排序,但不幸的是TypeORM不支持此功能:(你知道EF Core中是否支持这种类型的功能吗?我在这里看到了两个缺点:首先,你在添加另一个依赖项,其次,你在检索数据后进行排序,因此你实际上没有对DB数据进行排序,而是对DB resultsHi@SebastienH进行排序。你的观点都是有效的,但我认为我在我的第一篇文章中已经明确地说明了这一点。)tence:“如果你愿意通过将任务委托给lodash之类的库来进行内存排序[…]。