【问题标题】:Doctrine SoftDelete OneToOne RelationshipDoctrine SoftDelete OneToOne 关系
【发布时间】:2015-05-13 15:47:36
【问题描述】:

我的代码中有这些实体。

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 之间是 OneToOne 关系。我的问题是我也对我的实体使用软删除,所以当我删除一个实体时,实际上并没有删除,只设置了一个删除日期。稍后在审计跟踪中,我需要显示已删除的评论,当然我还需要来自父操作的信息。我的问题是,我需要建立这种关系 OneToMany 吗?还是有更好的方法?

【问题讨论】:

  • 我想我没完全明白你的问题,OneToMany 或 OneToOne 与软删除有什么关系?一个或另一个之间的实际问题是什么?定义关系类型取决于您想对这些实体做什么,而对行为NOT MUCH
  • 确实如此。如果您软删除 OneToOne 关系,拥有方仍将保留对已删除实体的引用,除非您替换/删除/清除该实体,否则您无法关联到新实体。但是如果你这样做了,那么你将失去对所有者实体的引用,并且以后将无法记录更改。
  • 哦,我明白了,那么据我所知(不多),您可以按照 建议的方式进行操作,使用 OneToMany 关系并验证只保留一个活着,其余的被软删除,这样你就可以有任何试镜的历史。我会尝试在验证中发布答案。
  • 好吧,nvm,我的想法是/** @preRemove */ 事件,并且在验证时抛出异常(这会回滚事务),但话又说回来,你永远不想删除它.​​.....所以。 ..对不起伙计,我的错:(

标签: php doctrine-orm one-to-one soft-delete


【解决方案1】:

说实话,我不太了解软删除行为。您需要注意的是,软删除实体是关系数据库中的严重妥协。

您可能希望在此特定实例中考虑事件溯源方法。我建议将有关删除和(软)删除实体的信息存储在基于文档的数据库中。

任何其他方法(如 OneToMany)仍然可以,但请记住,这里的风险是通过引入不连贯的关系来降低您的关系。

话虽如此,我完全意识到现实生活与理论完全不同 :) 祝你好运。

问候。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-16
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2013-01-06
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多