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

Posted

技术标签:

【中文标题】Doctrine ManyToOne 关系 - 在“设置”时自动删除【英文标题】:Doctrine ManyToOne relationship - auto-remove on "set" 【发布时间】:2021-04-16 12:35:27 【问题描述】:

我正在处理 Doctrine 中的关系(使用 Symfony 5)。 我所拥有的是这两种关系:

    用户 可用性

用户有一个 ID 并且有很多可用性。

所以实体用户有

/**
 * @ORM\OneToMany(targetEntity="UserAvailability", mappedBy="user")
 */
private $availability;

实体可用性则相反。

可用性与以下因素有关:

id、user_id、day_name、start_time 和 end_time,就这么简单。

我已经通过 ManyToMany 实现了并且我想在这种情况下实现的目标是:

我需要从客户端接收用户的全部可用性集并使用它来更新我的用户的可用性,所以我定义了一个 setAvailability 方法,它接收可用性实体的集合并简单地做

$this->availabilities = $availabilities.

这在我添加新的可用性时有效,但在我持久化实体时不会删除数据库上而不是集合中的可用性。

同样的方法可以完美地处理多对多关系。

我错过了什么?

*** 更新 **

public function setAvailability($availability): self
    
        $this->availability = $availability;
        return $this;
    

当删除多对多关系中的关系但不在多对一中时,相同的代码有效,属性“可用性”已正确设置,但在使用持久/刷新时,已删除的可用性不会在数据库上删除。

谢谢

【问题讨论】:

可以分享一下方法吗? User.availability 不是拥有方,因此,对它的更改只是部分应用。好好看看doctrine-project.org/projects/doctrine-orm/en/2.7/reference/…(特别是孤儿删除)。现在不确定是否必须在(用户)可用性对象上主动取消设置用户 【参考方案1】:

尝试按照以下教义文档中的示例设置属性:

<?php
use Doctrine\Common\Collections\ArrayCollection;

/** @Entity */
class User

    // ...
    /**
     * One user has many availabilities. This is the inverse side.
     * @OneToMany(targetEntity="Availability", mappedBy="user")
     */
    private $availabilities;
    // ...

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


/** @Entity */
class Availability

    // ...
    /**
     * Many availabilities have one user. This is the owning side.
     * @ManyToOne(targetEntity="User", inversedBy="availabilities")
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;
    // ...

属性mappedByinversedBy是关系所必需的

【讨论】:

我忘了说 mappedBy 和 inversedBy 设置正确。谢谢 你能完整地分享这两个实体吗?谢谢

以上是关于Doctrine ManyToOne 关系 - 在“设置”时自动删除的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 Doctrine ORM ManyToOne 关系在相反方向获取实体

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

Doctrine 中的 OneToMany 和 ManyToOne 关系 - 奇怪的映射错误

如何在ManyToOne Doctrine关系中约束将id号保存为字段值?

Doctrine ORM self ManyToOne 由于重复条目而无法插入