Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript TypeForm:如何按关系字段排序_Typescript_Typeorm - Fatal编程技术网

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之类的库来进行内存排序[…]。