【发布时间】:2012-10-26 22:48:24
【问题描述】:
我有一个与“城市”实体具有多对一关系的“人”实体:
这是人的关系映射:
/**
* @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?
【问题讨论】:
-
尝试使用 DataTransformer。检查symfony.com/doc/current/cookbook/form/data_transformers.html我不确定这是否是正确的解决方案。我稍后会尝试并给你反馈
-
感谢您的建议。这是一个有趣的选择,我目前正在研究它。尽管它没有反映在我上面的问题中,但 City 对象有几个额外的字段来定义它的唯一性:州、国家。我想知道这将如何在数据转换器环境中发挥作用。
标签: symfony doctrine one-to-many