Я пытаюсь создать простую ассоциацию OneToMany с двумя объектами:
class Professional extends User { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; public function __construct() { $this->followers = new \Doctrine\Common\Collections\ArrayCollection(); $this->following = new \Doctrine\Common\Collections\ArrayCollection(); $this->degrees = new \Doctrine\Common\Collections\ArrayCollection(); $this->experiences = new \Doctrine\Common\Collections\ArrayCollection(); } ... /** * @ORM\OneToMany(targetEntity="ProfessionalDegree", mappedBy="professional", cascade={"persist"}) */ private $degrees; ... ** * Add degrees * * @param \AppBundle\Entity\ProfessionalDegrees $degrees * @return Professional */ public function addDegree(\AppBundle\Entity\ProfessionalDegree $degrees) { $this->degrees[] = $degrees; return $this; } /** * Remove degrees * * @param \AppBundle\Entity\ProfessionalDegrees $degrees */ public function removeDegree(\AppBundle\Entity\ProfessionalDegree $degrees) { $this->degrees->removeElement($degrees); } /** * Get degrees * * @return \Doctrine\Common\Collections\Collection */ public function getDegrees() { return $this->degrees; }
А также
/** * @ORM\Entity * @ORM\Table(name="professional_degree") */ class ProfessionalDegree { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ private $id; public function __construct() { } ... /** * @ORM\ManyToOne(targetEntity="Professional", inversedBy="degrees") * @ORM\JoinColumn(name="professional_id", referencedColumnName="id") */ private $professional; ... /** * Set professional * * @param \AppBundle\Entity\Professional $professional * @return ProfessionalDegree */ public function setProfessional(\AppBundle\Entity\Professional $professional = null) { $this->professional = $professional; return $this; } /** * Get professional * * @return \AppBundle\Entity\Professional */ public function getProfessional() { return $this->professional; }
Когда я пытаюсь создать форму, используя Type:
class ProfessionalType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add($builder->create('degrees', CollectionType::class, array( 'entry_type' => DegreeType::class, 'allow_add' => true, 'allow_delete' => true, 'by_reference' => false, ))); } public function getParent() { return 'FOS\UserBundle\Form\Type\RegistrationFormType'; } public function getBlockPrefix() { return 'professional_registration_form'; } public function getName() { return $this->getBlockPrefix(); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'validation_groups' => array('ProfessionalRegistration'), )); } }
С этими DegreeType:
class DegreeType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('title') ->add('place') ->add('date_in', DateType::class, array( 'widget' => 'single_text' )) ->add('date_out', DateType::class, array( 'widget' => 'single_text' )); } public function getBlockPrefix() { return 'degree_registration_form'; } public function getName() { return $this->getBlockPrefix(); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => ProfessionalDegree::class, )); } }
Когда я обрабатываю форму на контроллере, новая степень добавляется в базу данных, но с профессионалом в NULL. Я читал в документе Symfony ( https://symfony.com/doc/current/form/form_collections.html ), что это может быть проблема «by_reference»
Есть идеи? Спасибо.