Typeorm:如何按关系字段排序

时间:2019-09-10 13:30:33

标签: typescript typeorm

我有一个歌手实体和一个相关的歌曲实体

歌手实体

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;

}

我想让所有SongsSinger名称排序

我搜索了docs和github问题,但找不到答案 我该如何解决?没有QueryBuilder

会更好

6 个答案:

答案 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)

没有查询生成器,我认为typeorm当前不支持它,目前feature request已打开

使用QueryBuilder还是很简单的:

dict

答案 2 :(得分:1)

如果您愿意通过将任务委托给lodash之类的库来在内存中进行订购,则不必使用查询生成器。

这样,您仍然可以使用EntityManagerRepository来查询数据。

// 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);

进一步阅读:

答案 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',
      },
});
相关问题