使用Symfony2表单更新共享主键的两个实体

时间:2015-04-20 16:28:57

标签: symfony doctrine-orm symfony-forms

我有两个实体:UserCompanyInfo

两者之间的关系为oneToOneUser可以为零或一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管理的,因此在执行级联时,会尝试创建一个新的。

有没有人遇到过同样的问题?任何想法都将非常感激!

谢谢, 哈维尔

1 个答案:

答案 0 :(得分:0)

我终于设法找到了解决方案,虽然它并不理想,但它确实有效。基本上,我process的{​​{1}}方法如下所示:

UpdateFormHandler

我确信(我希望)有更好的方法,但我很期待听到他们,因为这是唯一对我有用的东西。

我希望它有所帮助。

此致 哈维尔