我有一个与“城市”实体具有多对一关系的“人”实体:
这是人的关系映射:
/**
* @ORM\ManyToOne(targetEntity="City", inversedBy="persons", cascade={"persist"})
*/
private $city;
和城市的:
/**
* @ORM\OneToMany(targetEntity="Person", mappedBy="city")
*/
private $persons;
我使用由教义生成的基本 Symfony 2 'person' 控制器:generate:crud:
$entity = new Person();
$form = $this->createForm(new PersonType(), $entity);
$form->bind($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
}
PersonType 表单类型实例化了一个 CityType
class PersonType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('city', new CityType())
->add('firstname')
->add('lastname')
->add('gender')
...
CityType 表单类型有一个文本字段
class CityType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('cityname', 'text');
}
}
当我提交表单时,会创建 Person 实体以及 City 实体,这要归功于 cascade={"persist"}。
当我用数据库中已经存在的城市名称填写表格时,问题出现了,Doctrine 创建了另一个具有相同城市名称的条目。
Doctrine 是否有一种简单的方法可以检测到这一点,并使用 Person 表中现有的 city_id ?