Двунаправленные вложенные формы Symfony один к одному

1

У меня есть взаимно однозначные отношения между пользователем и институтом. Каждый пользователь может владеть институтом одновременно, и каждый институт принадлежит одному пользователю за раз. Что я хотел сделать, так это то, что у меня есть данные об институтах в таблице моего института, теперь я хочу создать пользователя и во время создания пользователя, я хочу назначить ему институт.

Я использую встроенную форму как коллекцию, но проблема заключается в том, что данные не загружаются во встроенную форму.

class User extends BaseUser
{
    /**
     * @ORM\OneToOne(targetEntity="PNC\InstitutesBundle\Entity\Institutes", mappedBy="user", cascade={"persist", "merge"})
     */
    protected $institute;
}


class Institutes {
   /**
     * @ORM\OneToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="institute")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;
}

Форма UserInstituteType.

 $builder->add('name', 'genemu_jqueryselect2_entity', array(
        //'mapped' => false,
        'required' => false,
        'class'=>'PNC\InstitutesBundle\Entity\Institutes',
        'property'=>'name',
        'multiple' => false,
        'attr' => array(
            'class' => 'form-control'
        )
        ));

и в форме Usertype.

 ->add('firstname','text',array(
                'label' => ucfirst('First Name *'),
                'required' => true,
                'constraints' => $constraints['firstname'],
                'attr'=> array(
                    'class' => 'form-control',
                    'autocomplete' => 'off'
                ),
                'label_attr'=> array(
                    'class' => 'control-label',
                ),
                ))
            ->add('lastname','text',array(
                'label' => ucfirst('Last Name *'),
                'required' => true,
                'constraints' => $constraints['lastname'],
                'attr'=> array(
                    'class' => 'form-control',
                    'autocomplete' => 'off'
                )))
            ->add('username', 'text', array(
                'required' => true,
                'pattern' => '^\(\d{5}\)-\d{7}-\d{1}$',
                'label' => ucfirst('NIC *'),
                'max_length' => 15,
                'constraints' => $constraints['username'],
                'attr'=> array(
                    'class' => 'form-control',
                    'autocomplete' => 'off'
                )
            ))
      ->add('institute',new UserInstituteType(),array(
                    'data_class' => 'PNC\InstitutesBundle\Entity\Institutes',
                    'label' => false,
                    'required' => false,
                    'mapped' => false,
                ))

и в контроллере

public function newAction(Request $request){
   $user = new User();
        $em = $this->getDoctrine()->getManager();
        $institutes = new Institutes();
        $user->setInstitute($institutes);
        $form = $this->createForm(new UserType(), $user, array(
            'action' => $this->generateUrl('pnc_users_users_new'),
            'method' => 'POST',
        ));
}

Проблема заключается в том, что форма хорошо работает, но в институте выпадающие данные не загружаются, поэтому я могу выбрать институт и назначить его пользователю. Новый/маленький опыт в symfony, так что застрял в этом, не знаю, где это было сделано неправильно...

  • 0
    Если вы замените свой UserInstituteType простой entity . Это показывает выбор с данными?
  • 0
    Да, я делаю это, как и раньше ..
Показать ещё 3 комментария
Теги:
forms
doctrine2
symfony2-forms

1 ответ

2
Лучший ответ

Во- первых, использовать тип entity для institute поля типа формы. Когда все работает, вы можете снова проверить тип формы genemu.

Затем я думаю, что у вас есть проблема с вашим сеттером. Из-за вашего комментария:

он сохраняет пользователя, но в таблице института столбец user_id по-прежнему пуст.

class User extends BaseUser
    {
    /**
     * @ORM\OneToOne(targetEntity="PNC\InstitutesBundle\Entity\Institutes", mappedBy="user", cascade={"persist", "merge"})
     */
    protected $institute;

    public function setInstitute(Institute $institute)
    {
        // Set the owning side of the relation!
        $institute->setUser($this);
        $this->institute = $institute;
    }
}


class Institutes {
   /**
     * @ORM\OneToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="institute")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

    public function setUser(User $user)
    {
        $this->user = $user;
    }
}

Вам нужно установить собственную сторону отношения, если вы не сохранили данные.

  • 0
    Спасибо, я потратил весь день, чтобы избавиться от этого вручную, поместив его в базу данных вручную из запросов .... Ваш ответ только что сделал это. классно.
  • 0
    Можете ли вы предложить мне решение для этого тоже. stackoverflow.com/questions/33868697/...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню