Symfony 一对一双向嵌入表单
Symfony one to one Bidirectional embedded forms
我和用户之间有一对一的双向关系
研究所。每个用户一次可以拥有一个学院,每个学院
一次由一个用户拥有。我想做的是我有
在我的研究所 table 中建立数据,现在我想创建用户和
在创建用户的时候,我想给他分配一个研究所。
我正在使用嵌入形式作为集合,但问题是数据未以嵌入形式加载。
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'
)
));
并采用用户类型形式。
->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',
));
}
问题是表格呈现得很好,但在学院下拉,
没有加载数据,因此我可以选择一个机构并将其分配给
用户。 New/little symfony中的exp,卡在这,不知道哪里做错了...
首先,对表单类型中的 institute
字段使用类型 entity
。一切正常后,您可以再次测试genemu表单类型。
接下来,我认为您的 setter 有问题。由于您的评论:
it saves the user, but in institute table the user_id column is still empty.
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;
}
}
您需要设置关系的拥有方,否则将不会保存任何数据。
我和用户之间有一对一的双向关系 研究所。每个用户一次可以拥有一个学院,每个学院 一次由一个用户拥有。我想做的是我有 在我的研究所 table 中建立数据,现在我想创建用户和 在创建用户的时候,我想给他分配一个研究所。
我正在使用嵌入形式作为集合,但问题是数据未以嵌入形式加载。
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'
)
));
并采用用户类型形式。
->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',
));
}
问题是表格呈现得很好,但在学院下拉, 没有加载数据,因此我可以选择一个机构并将其分配给 用户。 New/little symfony中的exp,卡在这,不知道哪里做错了...
首先,对表单类型中的 institute
字段使用类型 entity
。一切正常后,您可以再次测试genemu表单类型。
接下来,我认为您的 setter 有问题。由于您的评论:
it saves the user, but in institute table the user_id column is still empty.
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;
}
}
您需要设置关系的拥有方,否则将不会保存任何数据。