简体   繁体   中英

GraphQL - How retrieve id of previous mutation, during query of multiple mutations

i would like run multiple mutations in the same query.

In the example below, i create an order and after i create a product record, concerning previously created.

I must have 2 mutations.

First, i insert an order. In output, i retrieve among others, idorder.

Then, i insert an product. This product

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
    }
  }
}

Real example with SQL structure:


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

how can i retrieve idorder from output of createOrder above?

It is possible?

If i forgot some informations, don't hesitate.

Thanks in advance.

EDIT :

  • With PostGraphile, plugin "postgraphile-plugin-nested-mutations" or "custom mutations" (with PL PGSQL function)
  • Without PostGraphile, a resolver as the example of @xadm permits this particular nested mutation.

IMHO you can search for "nested mutations" - not described here, you'll easily find examples/tutorials.

Proposed DB structure (n-to-n relation):

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

... created in nested mutations (in reverse order product>order_line>order)

Product don't need orderID , but when you ask for it [in product resolver]

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

... you can simply get it (or rather many - array) from orderLines and orders tables [using simple SQL query - where price will be read from orderLines ]

orderedRecently resolver can get product id from parent object (usually 1st param)

Of course you can (and should) return data as order and orderLine types (to be cached separately, normalized):

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

where type orderedRecently: [Order!] - array can be empty, not eordered yet

update

I slightly misunderstood your requirements (naming convention)... you already have proper db structure. Mutation can be 'feeded' with complex data/input:

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

Your product is my orderLine , idrefproduct is product .

createOrder creates/inserts order and then use its id for creation of product records ( order.id , idrefproduct and quantity ). Resolver can return only order id or structured data (as above).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM