Doctrine软删除一对一关系

6
我代码中有这些实体。
class Review extends BaseEntity {

    /** @ORM\OneToOne(targetEntity="Action", mappedBy="review") */
    protected $action;
}


class Action extends BaseEntity {

    /** @ORM\OneToOne(targetEntity="Review", inversedBy="action") */
    protected $review;
}

正如您所看到的,Action和Review之间是一对一的关系。我的问题是,我也为实体使用了软删除,因此当我删除一个实体时,实际上并没有被移除,只是设置了一个删除日期。稍后在审计跟踪中,我需要显示已删除的评论,并且当然还需要来自父操作的信息。我的问题是,我需要将这个关系改为一对多吗?还是有更好的方法?


我觉得我没有完全理解你的问题,OneToMany或OneToOne关系与软删除有什么关系?一个与另一个之间的实际问题是什么?定义关系类型取决于您想要对这些实体做什么,而不是行为。 - Azteca
实际上是这样的。如果您软删除了OneToOne关系,则拥有方仍将保留对已删除实体的引用,除非您替换/删除/清除该实体,否则无法与新实体相关联。但是,如果您这样做,那么您将失去对所有者实体的引用,并且以后将无法记录更改。 - richardalberto
哦,我明白了,那么根据我的了解(不多),你可以按照建议的方式进行操作,使用_OneToMany_关系并进行验证,以保持只有一个处于活动状态,其余则被软删除,这样你就可以为任何审计记录历史。我会尝试在验证方面发布答案。 - Azteca
好吧,我的想法是使用 /** @preRemove */ 事件,并在验证时抛出异常(这会回滚事务),但再次强调,您永远不希望将其删除...所以...抱歉,我的错 :( - Azteca
1个回答

0
说实话,我不太喜欢软删除的行为。你需要知道的是,在关系型数据库中,软删除实体是一个强烈的妥协。
在这种情况下,您可能希望考虑事件溯源方法。我建议将有关删除和(软)删除实体的信息存储在基于文档的数据库中。
任何其他方法(如OneToMany)仍然可以使用,但请记住,这里的风险是通过引入不一致的关系来降低您的关系。
话虽如此,我完全意识到现实生活与理论相差很大 :) 祝好运。
敬礼。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接