【问题标题】:Removing OneToMany elements, Doctrine2删除 OneToMany 元素,Doctrine2
【发布时间】:2015-08-27 06:54:03
【问题描述】:

我有这个模型; 行程、地点、行程地点。

我需要路线和地点之间的多对多关系,但我还想存储一些关于这种关系的特定数据(比如笔记、自己的照片等),所以我决定引入一个名为 ItineraryVenue 的新实体。

所以 Itinerary 有 ItineraryVenues 的集合,这些集合又引用了 Venues。

我的问题是我无法从 Itinerary 对象中删除 ItineraryVenue。

$itinerary->itineraryVenues->removeElement($itineraryVenue);
$em->flush();

从 php 集合中删除元素,但不会从数据库中删除此 $itineraryVenue。

我已经设法强制 Doctrine2 删除 $itineraryVenue,但前提是我使用 orphanRemoval=true 注释 Itinerary::$itineraryVenues

由于孤儿移除将 Venue 视为私有财产,它也会移除 Venue 实体,我不希望这样。

是否有关系配置选项或正在“手动”删除使其按我想要的方式工作?

难以置信,这是一种常见的关系模式。

实体定义:

class Itinerary
{
    /**
     * @ORM\OneToMany(targetEntity="ItineraryVenue", mappedBy="itinerary", cascade={"persist", "remove"})
     */
    private $itineraryVenues;

    function __construct()
    {
        $this->itineraryVenues = new ArrayCollection();
    }
}

class ItineraryVenue
{
    /**
     * @ORM\ManyToOne(targetEntity="Itinerary", inversedBy="itineraryVenues")
     */
    private $itinerary;
    /**
     * @ORM\ManyToOne(targetEntity="Venue")
     */
    private $venue;

    function __construct()
    {
    }
}

class Venue
{
}

【问题讨论】:

    标签: php doctrine-orm


    【解决方案1】:

    你做对了:orphanRemoval - 是你需要的。所以,你应该像

    一样覆盖默认的 Itinerary::removeItineraryVenue
    public function removeItineraryVenue(\AppBundle\Entity\ItineraryVenue $itineraryVenue)
    {
        $itineraryVenue->setItinerary(null);
        $this->itineraryVenues->removeElement($itineraryVenue);
    }
    

    完整的工作示例在这里https://github.com/kaduev13/removing-onetomany-elements-doctrine2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-22
      • 2011-06-22
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 2013-07-18
      相关资源
      最近更新 更多