2017-08-30 12 views
0

私のフォームに問題があります。フォームは、新しいColleエンティティを作成し、それに他のColleエンティティをリンクする必要があります。 私はそれを提出すると、collesEnfantsコレクションフィールドの各項目の新しいエンティティが作成されます。作成された新しいエンティティは、親に正しくリンクされ、正しい「ordre」フィールドを持ちますが、それは新しく作成されたエンティティであり、選択したエンティティではありません。CollectionTypeでリンクされていないエンティティが作成されました

マイ形式:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('nom', TextType::class,['label' => 'Nom de la colle']) 
    ->add('collesEnfants', CollectionType::class, 
     ['label' => false, 
     'entry_type' => SousColleFormType::class, 
     'required' => true, 
     'allow_add' => true, 
     'allow_delete' => true, 
     'by_reference' => false]); 
} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'data_class' => 'PACES\ColleBundle\Entity\Colle' 
    ]); 
} 

SousColleFormType:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('matiere', EntityType::class, [ 
      'class' => 'PACESColleBundle:Matiere', 
      'attr' => ['class'=> 'matiere'], 
      'choice_label' => 'name', 
      'label' => false, 
      'required' => false, 
      'placeholder' => 'Choisissez une matière', 
      'mapped' => false]) 
     ->add('nom', EntityType::class, [ 
      'class' => 'PACESColleBundle:Colle', 
      'attr' => ['class' => 'colles'], 
      'choice_label' => 'nom', 
      'label' => false, 
      'group_by' => 'matiere', 
      'required' => true, 
      'placeholder' => 'choose.colle']) 
     ->add('ordre', IntegerType::class,[ 
      'attr'=>['class'=>'ordre'], 
      'required' => true, 
      'label' => false]); 
} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'data_class' => 'PACES\ColleBundle\Entity\Colle' 
    ]); 
} 

コントローラー:

$formColleMere = $this->createForm(AjoutSuperColleFormType::class, $colle); 
    $formColleMere->add('submit', SubmitType::class, ['label' => 'Créer']); 

    $formColleMere->handleRequest($request); 
    if ($formColleMere->isSubmitted() && $formColleMere->isValid()) { 

     $collesEnfants = $formColleMere->get('collesEnfants')->getData(); 
     foreach ($collesEnfants as $enfant) { 
      $colle->addColleEnfant($enfant); 
     } 

     if (!$colle->getCollesEnfants()->isEmpty()) { 
      $em->persist($colle); 
      $em->flush(); 
     } 

コレエンティティ:

class Colle 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** 
* @ORM\OneToMany(targetEntity="Colle", mappedBy="colleMere", cascade={"persist"}) 
* @ORM\OrderBy({"ordre" = "asc"}) 
*/ 
private $collesEnfants; 

/** 
* @ORM\ManyToOne(targetEntity="Colle", inversedBy="collesEnfants", cascade={"persist"}) 
* @ORM\JoinColumn(name="colleMere_id", referencedColumnName="id") 
*/ 
private $colleMere; 

/** 
* @var string 
* 
* @ORM\Column(name="nom", type="string", length=255) 
*/ 
protected $nom; 

{........} 

/** 
* @ORM\ManyToOne(targetEntity="PACES\ColleBundle\Entity\Matiere", inversedBy="colles", cascade={"persist"}) 
* @ORM\JoinColumn(name="matiere_id", referencedColumnName="id") 
* @ORM\OrderBy({"name" = "ASC"}) 
*/ 
protected $matiere; 

/** 
* Cet attribut sert aux 'super colles' qui sont le résultat d'une fusion de colles d'une même UE 
* @var integer 
* @ORM\Column(name="ordre", type="integer", nullable=true) 
*/ 
protected $ordre; 
+0

'$ collesEnfants = $ formColleMere->( 'collesEnfants')を取得 - >のgetData();'私にはありませんあなたのフォームで定義されていることを確認してください...あなたは現在のコードを与えてもよろしいですか?あなたがおそらくあなたの関連を定義している場合には、 'foreach'を必要とすべきではありません。 –

+0

collesEnfantsが最初の形式で定義されています。コレクションを含むフィールドです。私はforeachを必要とすべきではないと知っているが、私は多くのことを試みたが、それはまだそれが必要なように動作していない –

+0

ああおっとすごく私はそれを見ていない。私は後で詳しく見るようにしようとします –

答えて

0

collesEnfantsフィールドに'mapped' => falseを追加して、私が欲しいことをすることに成功しました。 私もコントローラーでこれらの行を変更:

$collesEnfants = $formColleMere->get('collesEnfants')->getData(); 
foreach ($collesEnfants as $enfant) { 
    $colle->addColleEnfant($enfant); 
} 

へ:

$collesEnfants = $formColleMere->get('collesEnfants')->getData(); 

foreach ($collesEnfants as $enfant) { 
    $colle->addColleEnfant($enfant['nom']); 
    $enfant['nom']->setOrdre($enfant['ordre']); 
} 
関連する問題