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

    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": []
      }
    }
    Ответ написан
    Комментировать