GraphQL - как получить идентификатор предыдущей мутации при запросе нескольких мутаций - PullRequest
2 голосов
/ 17 апреля 2020

Я хотел бы запустить несколько мутаций в одном запросе.

В приведенном ниже примере я создаю заказ, а после я создаю запись продукта, касающуюся ранее созданного.

У меня должно быть 2 мутации.

Сначала я вставляю заказ. В выводе я извлекаю среди прочих idorder.

Затем я вставляю товар. Этот продукт

mutation {
  createOrder(input: {
    order: {
      ordername: "My order"
    }
  }) {
    order {
      idorder
      ordername
    }
  },
  createProduct(input: {
    product: {
      quantity: 3
      idrefproduct: 25 # link to refProduct
      idorder: XXXX         # how can i retrieve idorder from output of createOrder above ? ?
    }
  }) {
    product {
      idproduct
    }
  }
}

Реальный пример со структурой SQL:


user(iduser, othersFields);
scenarios(idscenario, iduser, name, otherFields);

cultA(idcultA, idscenario, ...); // this table need of idscenario field
cultB(idcultB, idscenario, ...); // this table need of idscenario field
cultC(idcultC, idscenario, ...); // this table need of idscenario field

как я могу получить idorder из вывода createOrder выше? 101

Это возможно?

Если я забыл некоторые сведения, не стесняйтесь.

Заранее спасибо.

РЕДАКТИРОВАТЬ :

  • С PostGraphile плагин "postgraphile-plugin-nested-mutations" или "пользовательские мутации" (с функцией PL PG SQL)
  • Без PostGraphile, преобразователь как пример @xadm разрешает эту конкретную вложенную мутацию.

1 Ответ

0 голосов
/ 17 апреля 2020

ИМХО вы можете искать «вложенные мутации» - здесь не описано, вы легко найдете примеры / учебники.

Предлагаемая структура БД (отношение n-к-n):

order{orderID,lines[{orderLineID}] } > 
  order_line{orderLineID, productID, anount, price} > 
    product {productID}

... созданный с вложенными мутациями (в обратном порядке product> line_line> order)

Продукту не нужно orderID, но когда вы запрашиваете его [в решателе продуктов]

query product(id) {
  id
  orderedRecently {
    orderID
    date
    price
  }
}

... вы можете просто получить его (или, скорее, множество массивов) из таблиц orderLines и orders [используя простой запрос SQL - где price будет считан из orderLines]

orderedRecently распознаватель может получить продукт id из родительского объекта (обычно 1-й параметр)

Конечно, вы можете (и должны) возвращать данные в виде order и orderLine типов (в кешируется отдельно, нормализуется):

query product($id: ID!) {
  product(id: $id) {
    id
    orderedRecently {
      id
      date
      orderLine {
        id
        amount
        price
      }
    }
  }
}

где тип orderedRecently: [Order!] - массив может быть пустым, еще не упорядочен

update

Я немного неправильно понял ваши требования (присвоение имен соглашение) ... у вас уже есть правильная структура БД. Мутацию можно «подавать» со сложными данными / вводом:

mutation {
  createOrder(input: {
    order: {
      ordername: "My order"
      products: [
        {
          quantity: 3
          idrefproduct: 25 
        },
        {
          quantity: 5
          idrefproduct: 28
        }
      ]
    }
  }) {
    order {
      id
      ordername
      products {
        id
        idrefproduct    
        quantity
      }
    }
  }
}

Ваш product - это мой orderLine, idrefproduct - product.

createOrder создает / вставляет order и затем использует его id для создания записей продукта (order.id, idrefproduct и quantity). Resolver может возвращать только заказ id или структурированные данные (как указано выше).

...