Symfony Doctrine 关系 - 删除反面的实体

Posted

技术标签:

【中文标题】Symfony Doctrine 关系 - 删除反面的实体【英文标题】:Symfony Doctrine relationships - delete entity on the inverse side 【发布时间】:2017-02-27 10:58:09 【问题描述】:

我的问题是如何在不经过每个关联的情况下删除反面的实体并手动删除它。

<?php

/** @Entity */
class User

    // ...
    /**
     * @OneToMany(targetEntity="Address", mappedBy="user")
     */
    private $addresses;
    // ...

    public function __construct() 
        $this->addresses = new ArrayCollection();
    


/** @Entity */
class Address

    // ...
    /**
     * @ManyToOne(targetEntity="User", inversedBy="features")
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;
    // ...

在这个例子中,Address 是拥有方,所以我不能删除User,因为外键验证会失败。我必须删除Address,然后删除User。如果我有 10 个这样的关系,删除过程会很痛苦。

我可以创建ManyToMany 关系,但这样Address 实体将拥有users 而不是user,并且我希望地址只有一个用户。

最好的方法是什么?

【问题讨论】:

您可以使用选项ondelete=cascade制作DB外键,这样DB会自动删除所有子项。 我应该把onDelete放在哪里?关于多对一关系? docs.doctrine-project.org/projects/doctrine-orm/en/latest/… 【参考方案1】:

希望对您有所帮助。 只需将级联添加到反向实体即可。

/** @Entity */
class User

    // ...
    /**
     * @OneToMany(targetEntity="Address", mappedBy="user", cascade="persist", "remove")
     */
    private $addresses;
    // ...

    public function __construct() 
        $this->addresses = new ArrayCollection();
    
    /*
     * @return ArrayCollection
     */
    public function getAddresses ()
       return $this->addresses:
    

    /*
     * @pram Address $address
     */
    public function setAddresses (Address $address)
       $this->addresses->add ($address);
    

【讨论】:

以上是关于Symfony Doctrine 关系 - 删除反面的实体的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine symfony使用OneToMany删除实体 - ManyToOne关系

Symfony Doctrine 关系在 PhpUnit 测试中为空

Symfony 2 与 Doctrine 中的一对多关系

Symfony2 2.3.7 -Doctrine 2.4.1:ManyToMany 关系未保存到数据库

Doctrine ManyToOne 关系 - 在“设置”时自动删除

Symfony 5(Doctrine 2.9),Doctrine 不会为 ManyToOne 自引用关系生成迁移