我有两个实体:User
和CompanyInfo
。使用Symfony2格式更新两个实体共享主键
两者之间的关系是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'
));
}
它一切正常,表单与用户和公司信息字段都呈现。当创建一个新用户&公司信息,但只能是因为我做了在UserFormHandler
的onSuccess
以下(排在首位基本上坚持了User
,看起来有点hackie,但无法找到一个更好的办法):
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);
}
现在,问题是当我试图更新已有companyInfo的用户时。出于某种奇怪的原因,学说认为CompanyInfo
实体不存在,它试图做INSERT而不是UPDATE。这就好像实体CompanyInfo
它不是由Doctrine管理的,因此当级联持续时,试图创建一个新的。
有没有人遇到同样的问题?任何想法将非常感激!
感谢, 哈维尔
为什么要卸下公司'$用户> setCompanyInfo从用户实体(空)'我想这就是教义的原因是创建新的 –
只需用户ID添加到该公司,反之亦然。放弃保持主键同步的尝试。这只会造成下游问题。 – Cerad
Khalid这段代码只在POST上执行,不会在PUT或PATCH上运行,所以它必须是别的东西。我将它设置为null,否则级联坚持不起作用,因为两个实体具有相同的PK –