'graphql prisma query get artists who has song track

I have three table, artist, album and track. I want to query artist who have at least one song track.

Here is my graphql prisma schema. May I know how write the query?

generator client {
  provider = "prisma-client-js"
  binaryTargets = ["native", "linux-musl"]
}

generator typegraphql {
   provider           = "typegraphql-prisma"
  emitTranspiledCode = true
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model Artist {
  id              String    @id @default(cuid())
  name            String    @unique @db.VarChar(255)
  bio             String?   @db.VarChar(1024)
  profile_picture String    @db.VarChar(512)
  albums          Album[]
  tracks          Track[]
  active          Boolean   @default(true)
  user            User      @relation(fields: [user_id], references: [id])
  user_id         String
  created_at      DateTime  @default(now())
  updated_at      DateTime? @updatedAt

  @@map("artists")
}

model Album {
  id          String    @id @default(cuid())
  title       String    @db.VarChar(255)
  album_cover String    @db.VarChar(512)
  description String?   @db.VarChar(5120)
  released    Int       @default(1900)
  artists     Artist[]
  genres      Genre[]
  tracks      Track[]
  active      Boolean   @default(true)
  user        User      @relation(fields: [user_id], references: [id])
  user_id     String
  created_at  DateTime  @default(now())
  updated_at  DateTime? @updatedAt

  @@map("albums")
}

model Track {
  id          String       @id @default(cuid())
  title       String       @db.VarChar(255)
  description String?      @db.VarChar(5120)
  lyric     String?      @db.LongText
  mp3_url     String       @db.VarChar(1024)
  youtube_url String       @db.VarChar(1024)
  band       String?      @db.VarChar(255)
  duration    Int          @default(0)
  artists     Artist[]
  album       Album        @relation(fields: [album_id], references: [id])
  album_id    String
  songWriters SongWriter[]
  active      Boolean      @default(true)
  user        User         @relation(fields: [user_id], references: [id])
  user_id     String
  created_at  DateTime     @default(now())
  updated_at  DateTime?    @updatedAt

  @@map("tracks")
}

Here is Resolver

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> {
    const artists = (await prisma.artist.findMany({
      take: take,
      skip: (page - 1) * take,
      orderBy: [
        {
          name: "asc"
        }
      ]
    }));

    const count = (await prisma.artist.count({

    }));
    return {artists: artists, total: count};
  }
}


export default ArtistResolver;


Solution 1:[1]

This is like my answer in Prisma js ORM - how to filter for results that have entry in a related table (effectively JOIN)?

To get only Artists that have at least one Track, you should use some and specify a condition that always return true for any related record that exists.

And if you want to your query includes related Tracks you must specify it in include property.

 await prisma.artist.findMany({
   where: {
     tracks: {
       some: {
         id: { not: "" } // It always should be true.
       },
     },
   },
   
   // if you want to include related tracks in returned object:
   include: {
     tracks: true,
   },
 });

Solution 2:[2]

You can use prisma OR and gt to filter artist who have at least one song track.

OR accept an arrary of conditions that must return true, while gt means value must be greater than x.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Abdiel Araguayan
Solution 2 Enfield li