多重突变:如何让第一个突变将 ID 传递给第二个突变

Posted

技术标签:

【中文标题】多重突变:如何让第一个突变将 ID 传递给第二个突变【英文标题】:Multiple mutation: how to have first mutation pass ID to second mutation 【发布时间】:2020-06-02 08:55:54 【问题描述】:

问题

问题已解决,见下文

我希望使用 first mutation 创建的 ID 用于 第二次突变。在这种情况下,第二个突变需要来自 first 的 ID 才能工作。

示例代码:

输入 Order 和 Order_rule(后端)

type Order 
    order_id: ID!
    site_id: ID
    user_id: ID
    customer_name: String
    site: Site! @belongsTo
    order_rules: [Order_rule!]


type Order_rule 
    order_rule_id: ID!
    order_id: ID
    photo_id: ID
    product_id: ID
    site_id: ID
    order: Order! @belongsTo

CreateOrder 和 CreateOrder_rule 变异(后端)

     createOrder(
     site_id: ID!,
     user_id: ID!,
     customer_name: String!,
     ): Order @field(resolver: "OrderMutator@create")

createOrder_rule(    
    order_id: ID!
    foto_id: ID
    product_id: ID
    site_id: ID
    ): Order_rule @field(resolver: "Order_ruleMutator@create")

Order 和 OrderRules Mutator 相似(后端)

    public function create($rootValue, array $args, GraphQLContext $context)
    
        $order = new \App\Order($args);
        $order->save();

        return $order;
    

反应阿波罗

mutation createOrderAndOrderRules(
  $site_id: ID!
  $user_id: ID!
  $customer_name: String!
    $order_id: ID!
    $photo_id: ID,
    $product_id: ID,
)
createOrder(
  site_id: $site_id
  user_id: $user_id
  customer_name: $customer_name
) 

order_id

 createOrder_rule(
   order_id: $order_id
   photo_id: $photo_id
    product_id: $product_id
    site_id: $site_id
   ) 
    order_id
    photo_id
    product_id
    site_id
     

所以用例子来解释:我想要order_id,它是一个自动递增的主键, 将从 createOrder 突变生成,用于 createOrder_Rule 突变。

是否有任何建议的方法来完成这项工作?我希望有一种方法可以让多个 一个突变,只是传递信息,但我在较旧的答案中有红色,这是不可能的(还)。 我试图让它工作,但还没有找到方法。

非常感谢任何使这项工作的提示!提前致谢! :)

问题已解决:

在后端使用 input 和 mutator 有助于解决问题。 不再使用上面的最后一个突变。仅使用: 示例代码:

变异顺序

   createOrder(
    input: OrderInput! @spread
    ): Order @field(resolver: "OrderMutator@create")

类型

type Order 
    order_id: ID!
    site_id: ID
    user_id: ID
    customer_name: String
    site: Site! @belongsTo
    order_rules: [Order_rule!]


type Order_rule 
    order_rule_id: ID!
    order_id: ID
    photo_id: ID
    product_id: ID
    site_id: ID
    order: Order! @belongsTo

输入类型

input OrderInput 
    order_id: ID!
    site_id: ID
    user_id: ID
    customer_name: String
    order_rules: [InputOrder_rule]


input InputOrder_rule 
    photo_id: ID
    product_id: ID
    site_id: ID
    order_id: ID

Mutator Order (已移除 Order_ruleMutator)

保存订单,将 Order_rule 字段添加到 Order 并保存 Order_rule。

use App\Order;
use App\Order_rule;

class OrderMutator

    public function create($rootValue, array $args, GraphQLContext $context)
    

        $order = new \App\Order($args);
        $order->save();

        foreach($args['order_rules'] as $orderRules)
        
            $data_array = 
            array(
            'order_id' => $order->id,
            'site_id' => $orderRules['site_id'],
            'photo_id' => $orderRules['photo_id'],
            'product_id' => $orderRules['product_id'],
            );

            $orderRule = new \App\Order_rule($data_array);
            $orderRule->save();            

        
        return $order;
    

这使它对我有用,但任何其他提示总是受欢迎的!

【问题讨论】:

【参考方案1】:

问题已解决:

在后端使用 input 和 mutator 有助于解决问题。 不再使用上面的最后一个突变。仅使用: 示例代码:

变异顺序

   createOrder(
    input: OrderInput! @spread
    ): Order @field(resolver: "OrderMutator@create")

类型

type Order 
    order_id: ID!
    site_id: ID
    user_id: ID
    customer_name: String
    site: Site! @belongsTo
    order_rules: [Order_rule!]


type Order_rule 
    order_rule_id: ID!
    order_id: ID
    photo_id: ID
    product_id: ID
    site_id: ID
    order: Order! @belongsTo

输入类型

input OrderInput 
    order_id: ID!
    site_id: ID
    user_id: ID
    customer_name: String
    order_rules: [InputOrder_rule]


input InputOrder_rule 
    photo_id: ID
    product_id: ID
    site_id: ID
    order_id: ID

Mutator Order (已移除 Order_ruleMutator)

保存订单,将 Order_rule 字段添加到 Order 并保存 Order_rule。

use App\Order;
use App\Order_rule;

class OrderMutator

    public function create($rootValue, array $args, GraphQLContext $context)
    
 
        $order = new \App\Order($args);
        $order->save();
    
        foreach($args['order_rules'] as $orderRules)
        
            $data_array = 
            array(
            'order_id' => $order->id,
            'site_id' => $orderRules['site_id'],
            'photo_id' => $orderRules['photo_id'],
            'product_id' => $orderRules['product_id'],
            );

            $orderRule = new \App\Order_rule($data_array);
            $orderRule->save();            

        
        return $order;
    

这使它对我有用,但任何其他提示总是受欢迎的!

【讨论】:

以上是关于多重突变:如何让第一个突变将 ID 传递给第二个突变的主要内容,如果未能解决你的问题,请参考以下文章

如何在阿波罗客户端中将突变链接在一起

如何将值传递给第二个控制器

Django:将请求直接(内联)传递给第二个视图

如何将一个查询的结果传递给第二个查询并将结果显示在一个表中?

突变后如何使Relay的缓存失效

如何在突变 graphQL Playground 中传递变量?