我有两个表:user
和具有activity
关系的@OneToMany
。
我必须编写一个查询,该查询将为用户计算活动并以可用排序将其返回。我不知道如何排序,因此,我必须在所有字段(包括activityCount
)上启用排序。
我试图用loadRelationCountAndMap
这样的东西
async getUsersAndCount(
skip: number,
limit: number,
orderBy: string,
orderOptions: OrderByOptions,
query?: [string, ObjectLiteral][]
): Promise<[User[], number]> {
const initialQuery = this.createInitialQuery();
if (query && query.length > 0) {
query.forEach(q => initialQuery.andWhere(q[0], q[1]));
}
return await initialQuery.orderBy(orderBy, orderOptions)
.offset(skip)
.limit(limit)
.printSql()
.getManyAndCount();
}
private createInitialQuery(): SelectQueryBuilder<User> {
return this.createQueryBuilder('user')
.loadRelationCountAndMap('activityCount', 'user.activity', 'activityCount')
.where('user.status = 1')
.addGroupBy('user.id');
但是我无法通过activityCount
字段进行订购。
然后,我尝试使用subQuery,但是它无法创建将通过userId连接到活动表的查询。
然后我尝试使用像这样的普通SQL查询:
await this.query(
'SELECT u."id" AS "user_id",\n' +
' u."telegram_id" AS "user_telegram_id",\n' +
' u."telegram_username" AS "user_telegram_username",\n' +
' COUNT(a.id) AS activityCount\n' +
'FROM "user" u\n' +
'INNER JOIN activity a ON a."userId" = u.id\n' +
'WHERE u."status" = 1\n' +
'GROUP BY u."id"\n' +
`ORDER BY $1 $2\n` +
`OFFSET $3\n` +
`LIMIT $4`);
具有参数排序依据,方向,限制和偏移量的参数,但是typeorm没有填充这些参数,我得到了syntax error near $2
。
我可以连接字符串以填充参数,但这是很糟糕的方法。
我也可以使用VIEW
解决此问题,但是也许还有另一种方法?