【问题标题】:How to remove an entity when it is used an association class?使用关联类时如何删除实体?
【发布时间】:2012-08-29 20:51:01
【问题描述】:

我有一个与ArticleVote 一对多关系的类用户,Association Class 本身就是一个Association Class(见下文)。

这是我的实体的样子:

class User
{
    protected $articlesVotes;
}

用户持有ArticleVote 集合。

虽然 ArticleVote 由基于 UserIdArticleId 的复合主键引用:

class ArticleVote
{
    protected $article;
    protected $user;
}

现在,假设我想从User 中删除一个ArticleVote,我自然会这样做$user->getArticlesVotes()->removeElement($articleVote);,这会导致实际删除集合内的实体,但作为@987654332 @既是关系又是实体,数据库中的行根本没有被删除。

我知道,我可以做$em->remove($articleVote);,但我希望我可以从用户集合中删除它以绕过EntityManager,如果我想删除几个$articleVote怎么办?

目前,我通过传递Article 实体在我的User 模型中创建/删除投票,它是我的User 实体,它创建ArticleVote 对象并自行附加它,我希望我可以拥有相同的删除功能的行为。

有什么想法吗? (哦,顺便说一句,我已经尝试过使用 cascade="remove")

【问题讨论】:

  • 有一个名为 orphanRemoval 的选项(参见此处:doctrine-orm.readthedocs.org/en/2.0.x/reference/…)可能会起作用。但是您必须确保从文章和用户集合中删除 ArticleVote。
  • @Sgoettschkes,我不确定 orphanRemoval 是否可以在这里工作,我没有删除用户和文章,我正在删除它们之间的关联类。顺便说一下,ArticleVote 实体并没有被 Article 实体反转。
  • 看例子,我想这正是你所需要的。您正在从集合中删除一个对象,并希望在数据库中也将其删除。这就是他们在示例中所做的!我不确定它是否在用户和文章中都引用了您的对象,但我会试一试!
  • @Sgoettschkes,该死的你是对的,我被误导了 orphanRemoval 的行为!您可以将其发布为我可以接受的答案吗?

标签: php orm symfony doctrine-orm


【解决方案1】:

我昨天遇到了这个确切的问题。设置 cascade="remove" 时,这会删除 UnitOfWork 中标记的关联。但是,要从数据库中删除项目,您需要在 ArticlesVote 实体中标记 $user 属性以在删除时级联。就这样..

class ArticleVote
{
    protected $article;

    /**
     * @ManyToOne(targetEntity=....
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $user;
}

这将为您的数据库中的外键添加一个“删除时”级联,并且与已删除用户关联的文章投票将随之删除。

【讨论】:

    猜你喜欢
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2014-07-17
    • 2011-01-29
    • 2021-12-20
    • 2021-11-05
    相关资源
    最近更新 更多