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

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

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

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, так что застрял в этом, не знаю, где сделали неправильно …

1

Решение

Во-первых, используйте тип 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;
}
}

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]