GraphQL, Dataloader, [ORM или нет], имеет много понимания отношений

Я впервые использую загрузчик данных Facebook (https://github.com/facebook/dataloader).

Я не понимаю, как им пользоваться, когда у меня 1 ко многим отношениям.

Вот репродукция моей проблемы: https://enshrined-hydrant.glitch.me.

Если вы используете этот запрос на игровой площадке:

query {
  persons {
    name
    bestFriend {
      name
    }
    opponents {
      name
    }
  }
}

вы получаете ценности.

Но если вы откроете журнал консоли здесь: https://glitch.com/edit/#!/enshrined-hydrant, вы увидите эти вызовы базы данных, которых я хочу избежать:

GraphQL, Dataloader, [ORM или нет], имеет много понимания отношений

Мой Тип человека:

type Person {
  id: ID!
  name: String!
  bestFriend: Person
  opponents: [Person]
}

Я могу использовать загрузчик данных, подходящий для bestFriend: Person, но я не понимаю, как использовать его с opponents: [Person].

Как видите, преобразователь должен возвращать массив значений.

У вас есть какие-нибудь намеки на это?

Преобразование данных с помощью красноречивых аксессоров и мутаторов в Laravel
Преобразование данных с помощью красноречивых аксессоров и мутаторов в Laravel
Laravel поставляется с мощной функцией под названием "Eloquent Accessors and Mutators".
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
0
0
501
1

Ответы 1

Вам необходимо создать пакетные конечные точки для работы с загрузчиком данных - он не может выполнять пакетную обработку сам по себе.

Например, вам, вероятно, понадобятся следующие конечные точки:

GET /persons - returns all people
POST /bestFriends, Array<personId>` - returns an array of best friends matchin the corresponding array of `personId`s

Тогда ваши загрузчики данных могут выглядеть так:

function batchedBestFriends(personIds) {
  return fetch('/bestFriends', {
    method: 'POST',
    body: JSON.stringify(personIds))
  }).then(response => response.json());
  // We assume above that the API returns a straight array of the data.
  // If the data was keyed, you could add another accessor such as
  // .then(data => data.bestFriends)
}

// The `keys` here will just be the accumulated list of `personId`s from the `load` call in the resolver
const bestFriendLoader = new DataLoader(keys => batchedBestFriends(keys));

Теперь ваш преобразователь будет выглядеть примерно так:

const PersonType = new GraphQLObjectType({
  ...
  bestFriend: {
    type: BestFriendType,
    resolve: (person, args, context) => {
      return bestFriendLoader.load(person.id);
    }
  }
});

Другие вопросы по теме