如何强制symfony实体管理器识别现有的子实体?

时间:2016-12-16 14:20:37

标签: rest symfony symfony-2.8

我使用Fos_rest进行网络服务。 我从JSON的Angular App中获取了一个实体。 JSON示例:

{"model":
   {
    "trademark":
      {"id":1,"name":"Alfa Romeo"},
    "type":
      {"id":1,"code":"car","name":"Car"},
    "name":"147"
    }
}

该实体由两个子实体组成,称为"商标"和"键入"。

接收POST时,在控制器中执行以下操作:

public function cpostAction(Request $request, $idTrademark)
   {
        $entity = new Model();
        $form = $this->createForm(ModeloType::class, $entity);
        $form->handleRequest($request);  
        if ($form->isValid()) {
            $entity = $form->getData();
            $em = $this->getDoctrine()->getManager();
            $em->persist($entity);
            $em->flush();

            /*do things with the entity and return*/
        }
   }

在进行Flush时会出现问题,因为它识别" trademark"和"键入"作为新实体,因为这些实体在拥有" id"时已经存在。 如何强制实体经理识别实体" trademark"和"键入"从数据库?

P.S: 表格类型:

class ModelType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name')
                ->add('trademark', TrademarkType::class)
                ->add('type', TypeType::class)
                ->add('id');
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Model',
            'csrf_protection' => false,
            'allow_extra_fields' => true,
        ));
    }
}

1 个答案:

答案 0 :(得分:0)

您不应该执行find():它会执行数据库请求。喜欢:

$em->getReference(Type::class, $entity->getType()->getId())

它不是数据库查询。唯一的问题是getReference不检查实体是否仍存在于数据库中。对我来说getReference只应该用于将id转换为doctrine代理对象