Gariks
@Gariks

Prisma.io — как получить количество записей в модели?

Есть GraphQL сервер написанный на TypeScript с использованием данного примера (graphQL-yoga, prisma).
Есть sсhema.graphql
type Game {
  id: ID!
  name: String!
  excerpt: String
}

type Query {
    games: [Game!]!
}


Как получить количество записей в бд модели Game?
  • Вопрос задан
  • 421 просмотр
Пригласить эксперта
Ответы на вопрос 1
Fi1osof
@Fi1osof
JS fullstack developer
Запаздалый ответ, но все же.
Когда вы деплоите схему, на каждый тип формируется три типа запроса (речь про Query):
object - уникальный объект
objects - список объектов
objectsConnection - список объектов с данными количества и т.п.

В вашем случаем это будет

query {
  gamesConnection{
    aggregate{
      count
    }
    edges{
      node{
        id
      }
    }
  }
}


Ответ будет типа:
{
  "data": {
    "gamesConnection": {
      "aggregate": {
        "count": 0
      },
      "edges": []
    }
  }
}


Соответственно edges не обязательно указывать, если вам надо получить только кол-во записей.

Важный момент: в более ранних версиях призмы (типа 1.15) aggregate возвращало общее кол-во найденных объектов. То есть, к примеру, если вы напишите такой запрос:
query {
  gamesConnection (
    where: {
      name_contains: "Test"
    }
    first: 2
  ){
    aggregate{
      count
    }
    edges{
      node{
        id
      }
    }
  }
}


Вы могли получить ответ типа
{
  "data": {
    "gamesConnection": {
      "aggregate": {
        "count": 15
      },
      "edges": [{id:"dsfdsf"}, {"id":"sdfsdgds}]
    }
  }
}


То есть Получено 2 записи (потому что first: 2 указано), но всего найдено 15 записей, содержащих в названии "Test".

Так вот, в более поздних версиях (и сейчас), aggregate возвращает именно кол-во полученных записей, то есть в нашем случае вернет не 15, а 2 (потому что получил 2 записи), даже если там всего 15 записей имеется. Я считаю, что такое изменение абсолютно бессмысленно (потому что на стороне клиента я и сам могу посчитать сколько объектов получил), и даже тикет им отправлял, но они сказали, что это фича, а не бага.
По этой причине надо писать запросы типа так:
query games (
  $where: GameWhereInput
  $first: Int
){
  gamesConnection (
    where: $where
  ){
    aggregate{
      count
    }
  }
  
  games (
    where: $where
    first: $first
  ){
    id
    name
  }
}


То есть тут сразу два запроса с передачей условия и лимита как параметры.
В первый (подсчет) передается только условие. А во второй (непосредственно список объектов) уже условие и лимит (и другие параметры, если надо). Ответ будет типа
{
  "data": {
    "gamesConnection": {
      "aggregate": {
        "count": 0
      }
    },
    "games": []
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы