我有一个与用户实体相关的表单 UserType 。 此表单调用另一种形式: CityType
<?php
namespace ...\SiteBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('city', new CityType(), array('label' => false))
->add(...);
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'FindBack\SiteBundle\Entity\User',
'cascade_validation' => true
));
}
// ...
}
用户关联表如下所示:
id | city_id | ...
---|---------|-----
1 | 1 | ...
2 | 1 | ...
3 | 2 | ...
这是 CityType :
<?php
namespace FindBack\SiteBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class CityType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name', 'text');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'FindBack\SiteBundle\Entity\City',
));
}
public function getName()
{
return 'city';
}
}
因此,当我通过 UserType 表单创建用户时,会创建一个新的 City 。 如果我使用相同的城市名称(即:马赛)创建用户两次,我的数据库将如下所示:
id name
--|----------
1 | Marseille
2 | Marseille
3 | Paris
...
所以有重复,我想避免它! 我该怎么办?我尝试为 City 表的 name 字段设置一个唯一约束,但是当我想创建另一个 User 时,“ SQLSTATE [23000]:完整性约束违规:1062 Symfony2抛出重复条目'Marseille'作为密钥'name'。这似乎是逻辑。
如果数据库中已存在名为“Marseille”的城市,我是否需要检查与用户关联的控制器,然后将存在的 City 与我的用户相关联?
答案 0 :(得分:0)
首先,你需要:
这只是一个例子,因为我对你的申请几乎一无所知:
use Symfony\Component\HttpFoundation\Request;
public function registerUserAction(Request $request) {
[...]
$cr = $this->getDoctrine()->getManager()->getRepository('CityRepository');
[...]
$user = new User();
$form = $this->createForm(new $form(...), $user);
$form->bind($request);
//get the field from form
$cn = $request->get('city_name');
//search for a pre existent entity
$city = $cn->findOneByCityName($cn);
if($city) {
$user->setCity($city);
}
if($form->isValid()){
[...]
}
}