OneToOne关系中的级联操作令人困惑

时间:2016-02-05 11:50:55

标签: symfony doctrine-orm doctrine symfony-2.7

我有两个相关的对象:

用户

/**
 * @ORM\OneToOne(targetEntity="File", mappedBy="userProfileImage")
 */
protected $profileImage;

文件

/**
 * @ORM\OneToOne(targetEntity="User", inversedBy="profileImage")
 * @ORM\JoinColumn(name="userProfileImage", referencedColumnName="id", onDelete="SET NULL")
 */
protected $userProfileImage;

和我的数据库中的两个相关记录。我想删除旧的File对象并将其替换为新的File。问题是我无法删除File对象,因为我有以下错误:

  

通过“MyBundle \ Entity \ User#profileImage”关系找到了一个新实体,该关系未配置为对实体进行级联持久操作:MyBundle \ Entity \ File @ 000000001604d7ad000000003cc76066。要解决此问题:在此未知实体上显式调用EntityManager#persist()或在映射中配置级联持久保存此关联,例如@ManyToOne(..,cascade = {“persist”})。如果您无法找出导致问题的实体,请执行'MyBundle \ Entity \ File #__ toString()'以获取线索。

在我看来,删除应该在调用后工作:

$this->getDoctrine()-getManager()->remove( $user->getProfileImage() );
$this->getDoctrine()-getManager()->flush();

我尝试将cascade={"all"}cascade={"persist", "remove"}添加到$profileImage注释,但没有成功。我需要有人向我解释我做错了什么以及我该怎么做。

2 个答案:

答案 0 :(得分:0)

我不确定这是否是解决方案但是我应该明确告诉级联删除

/**
 * @ORM\OneToOne(targetEntity="User", inversedBy="profileImage", cascade={"persist", "remove")
 * @ORM\JoinColumn(name="userProfileImage", referencedColumnName="id", onDelete="CASCADE")
 */
protected $userProfileImage;

答案 1 :(得分:0)

我找到了解决方案: 要删除相关对象,我不应该直接删除它:

$this->getDoctrine()-getManager()->remove( $file );

但通过用户:

$userFile = $user->getProfileImage();
$this->getDoctrine()-getManager()->remove( $userFile );
$this->getDoctrine()-getManager()->remove( $file );

此外,有必要在上述代码之前和之后调用flush()

$this->getDoctrine()-getManager()->flush();

$userFile = $user->getProfileImage();
$this->getDoctrine()-getManager()->remove( $userFile );
$this->getDoctrine()-getManager()->remove( $file );

$this->getDoctrine()-getManager()->flush();

我不知道为什么,但它对我来说很好,也许对其他人有用。

它并没有改变这个事实,这是一个非常难看的解决方案,所以如果有人知道如何改进这些代码,请告诉我!我将不胜感激。