我有两个实体:User
和CompanyInfo
。
两者之间的关系为oneToOne
,User
可以为零或一CompanyInfo
,一个CompanyInfo
属于User
。
因此我将它们设置为具有相同的主键(用户ID):
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\OneToOne(targetEntity="CompanyInfo", mappedBy="user", cascade={"persist"})
* @var CompanyInfo
*/
protected $companyInfo;
...
}
class CompanyInfo
{
/**
* @ORM\OneToOne(targetEntity="User", inversedBy="companyInfo", cascade={"persist"})
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* @ORM\Id
* @var User
*/
protected $user;
....
}
我在尝试同时公开它们时遇到了问题,因此只需提交一个表单即可更新它们:
在UserFormType中,我有以下一行:
$builder->add('companyInfo', new CompanyInfoFormType(), ['required' => false, 'by_reference' => false])
CompanyInfoFormType
具有以下内容:
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => '....\Entity\CompanyInfo',
'intention' => 'registration'
));
}
一切正常,表单用用户和公司信息字段呈现。在创建新用户时companyInfo它的工作原理只是因为我在onSuccess
的{{1}}中做了以下操作(基本上坚持UserFormHandler
在第一位,看起来有点hackie但找不到更好的方法) :
User
现在,问题是当我尝试更新已经拥有companyInfo的用户时。出于一些奇怪的原因,学说认为 if ($user->getCompanyInfo() instanceof CompanyInfo) {
$companyInfo = $user->getCompanyInfo()->setUser($user);
$user->setCompanyInfo(null);
$this->entityManager->beginTransaction();
$this->entityManager->persist($user);
$this->entityManager->flush();
$this->entityManager->persist($companyInfo);
$this->entityManager->flush();
$this->entityManager->commit();
$this->entityManager->refresh($user);
}
实体不存在,并且它试图进行INSERT而不是UPDATE。这就像实体CompanyInfo
它不是由Doctrine管理的,因此在执行级联时,会尝试创建一个新的。
有没有人遇到过同样的问题?任何想法都将非常感激!
谢谢, 哈维尔
答案 0 :(得分:0)
我终于设法找到了解决方案,虽然它并不理想,但它确实有效。基本上,我process
的{{1}}方法如下所示:
UpdateFormHandler
我确信(我希望)有更好的方法,但我很期待听到他们,因为这是唯一对我有用的东西。
我希望它有所帮助。
此致 哈维尔