2016-12-16 9 views
1

私はWebサービスを行うためにFos_restを使用しています。 JSONのAngular Appからエンティティを受け取っています。 JSON例:symfonyエンティティマネージャに既存のサブエンティティを認識させるにはどうすればよいですか?

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

エンティティは、「商標」と「タイプ」と呼ばれる2つのサブエンティティ、から構成されています。

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"。 エンティティマネージャがエンティティ "trademark"と "type"をデータベースから認識するようにするにはどうすればよいですか?

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

にIDを変換するために使用すべきです、$ entity-> getTrademark() - > getId())); $ entity-> setType($ em-> find(Type :: class、$ entity-> getType() - > getId())); – Niko

+0

findを実行すべきではありません。データベース要求を行います。 '$ em-> getReference(Type :: class、$ entity-> getType() - > getId())' – goto

+0

をお勧めします。ありがとう! – Niko

答えて

0

あなたはfind()を行うべきではありません。これはデータベース要求を行います。希望:

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

データベースクエリではありません。唯一の問題はgetReferenceです。エンティティがまだデータベースに存在するかどうかはチェックされません。 $ ENTITY-> setTrademark($ EM->(商標::クラス見つける:私にとってgetReferenceは「永続」の前に、私は次の行を追加して、それを解決し教義プロキシオブジェクト

+0

'$ em-> persist($ entity);を実行してから問題はありません。 $ em-> flush(); 'エンティティが存在しない場合、例外をスローします。返信いただきありがとうございます! – Niko

関連する問題