2016-12-16 67 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