Symfony2嵌入表单和数据库重复

时间:2014-02-02 17:17:31

标签: php forms symfony doctrine-orm duplicates

我有一个与用户实体相关的表单 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 与我的用户相关联?

1 个答案:

答案 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()){
    [...]
  }
}