Apollo / React改变了两个相关的表格

时间:2017-05-12 14:04:31

标签: graphql react-apollo apollo-client

假设我有两个表,一个包含产品,另一个包含价格。

在Graphql中,查询可能如下所示:

option {
    id
    price {
      id
      optionID
      price
      date
    }
    description
}

我向用户提供一个表格(在React中),他们可以在同一时间输入产品详细信息和价格。

当他们提交表单时,我需要在“product”表中创建一个条目,然后在“price”表中创建一个相关条目。

我是Graphql的新手,React就此而言,并且发现它是一个陡峭的学习曲线并且一直在关注Apollo教程并阅读文档但是到目前为止,这个任务的解决方案仍然是个谜!

有人可以让我摆脱痛苦并给我,或指出我最方便的处理突变所需的例子吗?

1 个答案:

答案 0 :(得分:2)

简而言之,如果您希望针对尽可能少的请求进行优化,那么服务器实际应该处理这些事情。

问题:这里的问题是您有依赖关系。您需要先创建产品,然后使用该产品的ID,将其与新价格相关联。

解决方案:在服务器上实现此功能的最佳方法是在突变输入中向Product添加另一个字段,以便在同一请求输入中输入Price的详细信息。这在Scaphold上称为"nested create"

例如:

  <?php
    namespace ParametersBundle\Form;       
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

    class CountriesType extends AbstractType
    {

        /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options){
            $fooChoices = $options['choices'];

            $builder->add('active',CheckboxType::class)
            ->add('countries',TextType::class)
            ->add('countries',ChoiceType::class,['choices' => $fooChoices,])
            ->add('save', SubmitType::class, array('label' => 'Create Post'));
        }
        /**
         * {@inheritdoc}
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'choices' => null,
                )
                //'data_class' => 'DataBaseBundle\Entity\Cities'
            ));
        }

        /**
         * {@inheritdoc}
         */
        public function getBlockPrefix()
        {
            return 'country';
        }


    }

然后,在服务器上,您可以解析解析器参数中的price对象,并在创建产品时创建新的price对象。同时,您也可以在服务器上同时关联它们。

希望这有帮助!