2016-12-16 71 views
1

我正在使用Fos_rest做一个web服务。 我从JSON中的角度应用程序中收集实体。 JSON例如:如何强制symfony实体管理器识别现有的子实体?

{"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*/ 
     } 
    } 

做冲洗时的问题给出的,因为它承认,因为“商标”和“类型”为新​​的实体,这些已经存在拥有时一个“id”。 如何强制实体经理从数据库中识别实体“商标”和“类型”?

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, 
     )); 
    } 
} 
+0

我通过在“Persist”之前添加以下几行来解决它: $ entity-> setTrademark($ em-> find(Trademark :: class ,$ entity-> getTrademark() - > getId())); (类型::类,$实体 - > getType() - > getId())); $实体 - > setType($ em-> find – Niko

+0

你不应该做一个查找:它做一个数据库请求。首选'$ em-> getReference(Type :: class,$ entity-> getType() - > getId())' – goto

+0

这就是我正在寻找的。谢谢! – Niko

回答

0

你不应该做find():它确实数据库请求。身高:

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

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

+0

没有问题,因为执行'$ em-> persist($ entity); $ em-> flush();'如果实体不存在则抛出异常。谢谢回复! – Niko