基于Prisma GraphQL Schema,如何编写查询至少拥有一首Track的Artist的GraphQL语句?
获取至少拥有一首Track的Artist查询实现
我来帮你搞定这个需求——筛选出至少关联了一首Track的Artist。咱们直接基于你现有的代码来修改,操作很简单:
核心原理
要实现这个筛选,咱们需要利用Prisma的关系查询条件some,它可以用来检查某个关联关系中是否存在至少一条符合条件的记录。对于你的场景,只要Artist的tracks关联里有至少一条记录,就满足要求。
修改后的Resolver代码
直接更新你的ArtistResolver里的查询逻辑,给findMany和count都加上过滤条件:
import { Resolver, ArgsType, Field, Args, Query, Ctx, ObjectType, Int } from "type-graphql"; import { Artist } from "@generated/type-graphql"; import { Context } from "../interfaces"; @ArgsType() export class ArtistArgs { @Field((type) => Int, { nullable: false }) page!: number; @Field((type) => Int, { nullable: false }) take!: number; } @ObjectType() export class ArtistResponse { @Field(type => [Artist]) artists: Artist[] =[]; @Field((type) => Int, { nullable: false }) total!: number; } @Resolver() class ArtistResolver { //@Authorized("ADMIN") @Query((returns) => ArtistResponse, { nullable: true }) async getArtists(@Ctx() { req, res, prisma }: Context, @Args() { page, take }: ArtistArgs): Promise<ArtistResponse | null> { // 添加 tracks.some 条件筛选有至少一首Track的Artist const artists = await prisma.artist.findMany({ take: take, skip: (page - 1) * take, orderBy: [ { name: "asc" } ], where: { tracks: { some: {} // 空对象表示只要存在至少一条关联Track即可 } }, // 可选:如果需要同时返回关联的Track,可以加上include // include: { // tracks: { take: 5 } // 比如只返回每个Artist的前5首Track // } }); // 统计时也要用相同的过滤条件,确保总数准确 const count = await prisma.artist.count({ where: { tracks: { some: {} } } }); return { artists, total: count }; } } export default ArtistResolver;
扩展说明
如果之后你需要更精确的筛选(比如只统计拥有活跃Track的Artist),只需要给some加上具体条件就行:
where: { tracks: { some: { active: true // 只关联了活跃状态Track的Artist } } }
GraphQL查询示例
你可以用下面的查询语句来测试效果:
query GetArtistsWithTracks { getArtists(page: 1, take: 10) { artists { id name profile_picture tracks { id title mp3_url } } total } }
内容的提问来源于stack exchange,提问作者Alex Aung
相关产品推荐
相关产品推荐

