2013-12-18 3 views
3

Мне нужна помощь, чтобы понять, что я делаю неправильно, я пытался найти один ответ здесь, но ничего не работает.Symfony2 один к одному отношение форма

здесь моя проблема ..

У меня есть два объекта с отношением один-к-одному:

... 
class FarmInfo 
{ 
    ... 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="areaCovered", type="integer", nullable=true) 
    */ 
    private $areaCovered; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="totalIrrigatedArea", type="integer", nullable=true) 
    */ 
    private $totalIrrigatedArea; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="totalStaff", type="integer", nullable=true) 
    */ 
    private $totalStaff; 

    /** 
    * @var DairyInfo 
    * @ORM\OneToOne(targetEntity="DairyInfo", mappedBy="farmInfo", cascade={"persist","remove"}) 
    */ 
    private $dairyInfo; 

    ... 
} 

и

... 
class DairyInfo 
{ 
    ... 

    /** 
    * @var FarmInfo 
    * 
    * @ORM\OneToOne(targetEntity="FarmInfo", inversedBy="dairyInfo", cascade={"persist"}) 
    * @ORM\JoinColumn(name="farmInfoId", referencedColumnName="id") 
    * 
    */ 
    private $farmInfo; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="peakCowMilked", type="integer", nullable=true) 
    */ 
    private $peakCowMilked; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="cowsMilkedInWinter", type="smallint", nullable=true) 
    */ 
    private $cowsMilkedInWinter; 

    ... 
} 

здесь formTypes:

class FarmInfoType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('areaCovered'); 
     $builder->add('totalIrrigatedArea'); 
     $builder->add('totalStaff'); 

     $builder->add('dairyInfo', new DairyInfoType()); 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'FOO\CoreBundle\Entity\FarmInfo' 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'foo_corebundle_farminfo'; 
    } 
} 

class DairyInfoType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('peakCowMilked'); 
     $builder->add('cowsMilkedInWinter'); 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'FOO\CoreBundle\Entity\DairyInfo' 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'foo_corebundle_dairyinfo'; 
    } 
} 

Создать форму для меня с FarmInfo и DairyInfo в той же форме, как я хочу, но когда я настойчив, FarmInfo сохраняются в порядке и DairyInfo сохраняются все поля, но farmInfoId всегда нуль:

+---------------+--------------------+------------+ 
| peakCowMilked | cowsMilkedInWinter | farmInfoId | 
+---------------+--------------------+------------+ 
|   11 |     11 |  NULL | 
+---------------+--------------------+------------+ 

Что я должен сделать для symfony получить этот идентификатор автоматически?

Благодарим вас за продвижение.

ответ

8

Вы не показали свои методы, но я абсолютно уверен, у вас есть:

class FarmInfo 
{ 
    setDairyInfo($dairyInfo) 
    { 
     $this->dairyInfo = $dairyInfo; 
    } 
} 

Проблема заключается в том, что ничто не является установка farmInfo в классе dairyInfo. Поэтому измените setDairyInfo на:

setDairyInfo($dairyInfo) 
    { 
     $this->dairyInfo = $dairyInfo; 
     $dairyInfo->setFarmInfo($this); 
    } 

И вам должно быть хорошо идти.

+1

Большое спасибо! это была проблема! Я пробовал все и был чем-то таким простым. – Bruno

+1

Я не могу дать вам баллы за ваш ответ, потому что у меня нет достаточной репутации, но вы мне очень помогли! – Bruno

+1

Нет проблем. Это на самом деле очень распространенная проблема. Просто не то, что легко для Google. – Cerad

Смежные вопросы