2014-11-11 1 views
1

Привет, у меня есть проблема с моей многократной встроенной формой (один для многих). В одной игре есть много призов, и у одного приза есть много вариантов. Когда я attemp, чтобы сохранить эту форму получите сообщение об ошибкеSymfony2 несколько встроенных форм от одного до многих обновить внешний ключ

SQLSTATE [23000]: Integrity нарушение ограничения: 1048 Колонка «fk_prize» не может быть пустым

Я уже установил в моей сущности на каскад и в моей форме типа set by_refference false, но не работал. Все остальные назначенные внешние ключи работают отлично.

ОБНОВЛЕНО: В контроллере, когда я делаю эту форму, сохранен успешно. Но я хочу сделать это с учением. Это ошибка в доктрине или что-то не так в моем коде? Спасибо за ваше время!

  //Hacked code in controller to save the form 
      $prizes = $data->getPrizes(); 
      foreach ($prizes as $prize) { 
       $prizeOptions = $prize->getPrizesOptions(); 
       foreach ($prizeOptions as $prizeOption) { 
        $prizeOption->setPrize($prize); 
       } 
      } 
      $em->persist($data); 
      $em->flush(); 





<?php 
    class Game 
    { 
     /** 
     * @ORM\OneToMany(targetEntity="Prize", mappedBy="game", cascade={"persist"}) 
     */ 
     protected $prizes; 

     public function __construct() 
     { 
      $this->gameUsers = new ArrayCollection(); 
      $this->prizes = new ArrayCollection(); 
     } 


    } 
    ?>  

<?php   

     class GameType extends AbstractType 
     { 

      /** 
      * @param FormBuilderInterface $builder 
      * @param array $options 
      */ 
      public function buildForm(FormBuilderInterface $builder, array $options) 
      { 


       $builder 
        ->add('alias', 'text' , [ 
         'label'=>'Name' 
        ])    
        ->add('prizes' ,'collection', array(
         'type'   => new PrizeType($this->intention), 
         'allow_add' => true, 
         'allow_delete' => false, 
         'prototype' => true, 
         'by_reference' => false, 
         'label' => false, 
        ))     
        ->add('save', 'submit', [ 
         'attr' => [ 
          'class' => 'btn btn-primary' 
         ] 
        ]); 
      }     
     } 

    <?php 

    class Prize 
    { 

    /** 
    * The Game 
    * @ORM\ManyToOne(targetEntity="Game") 
    * @ORM\JoinColumn(name="game_id", referencedColumnName="id") 
    */ 
    protected $game; 

    /** 
    * @ORM\OneToMany(targetEntity="PrizeOptions", mappedBy="prize", cascade={"persist"}) 
    */ 
    protected $prizes_options; 

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->prizes_options = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 
    } 

    class PrizeType extends AbstractType 
    { 

     /** 
     * @param FormBuilderInterface $builder 
     * @param array $options 
     */ 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 

      $builder    
       ->add('prizes_options' ,'collection', array(
        'type' => new PrizeOptionsType(), 
        'allow_add' => true, 
        'allow_delete' => true, 
        'by_reference' => false, 
        'label' => false, 
       ))  
      ; 
     } 


    } 

    <?php 

    class PrizeOptionsType extends AbstractType 
    { 

     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 
      $builder 
       ->add('name', 'text' , [ 
        'label'=>'Value' 
       ]) 
       ; 
     } 

    } 

ответ