Doctrine 一对多关系和多对一关系

Doctrine one-to-many relationship AND many-to-one

我有两张桌子。我要建立一对多关系,还要建立多对一关系

一个页面可以有一个背景 - 这是页面的背景。

一个页面也可以有很多背景 - 这是用户上传的背景集合,将从中选择一个作为第一个关系。

换句话说,用户从一堆预定义的背景中选择一个背景,或者从他上传的许多背景中选择一个来试用。

编辑:删除背景时,我希望所有带有 background_id 的页面都将 background_id 设置为空。删除页面时,我希望删除属于该页面的所有自定义背景。

虽然 doctrine 和 symfony 允许上述配置,但在删除页面时,Doctrine 会完全忽略背景上的 cascade="{remove}" 属性,当然在尝试删除页面时会引发异常在删除它的自定义背景之前。

我做错了什么?

class Background
{
/**
 * @var string
 *
 * This attribute is for user uploaded backgrounds.
 *
 * @ORM\ManyToOne(targetEntity="Page",inversedBy="customBackgrounds")
 * @ORM\JoinColumn(name="page_id",referencedColumnName="id")
 */
protected $page;

/**
 * @var string
 *
 * This field helps admins to gauge popularity
 *
 * @ORM\OneToMany(targetEntity="Page",mappedBy="background")
 */
protected $pages;
}


class Page
{
/**
 * @var string
 *
 * @ORM\ManyToOne(targetEntity="Background",inversedBy="pages")
 * @ORM\JoinColumn(name="background_id",referencedColumnName="id", nullable=true, onDelete="SET NULL")
 */
protected $background;

/**
 * @ORM\OneToMany(targetEntity="Background", mappedBy="page", cascade={"remove"})
 * @ORM\OrderBy({"id" = "ASC"})
 */
protected $customBackgrounds;
}

您唯一可以做的就是在您的实体中使用事件侦听器,当页面被删除时,将其背景设置为 null 或另一个 id

尝试 @ORM\JoinColumn(name="page_id",referencedColumnName="id", onDelete="SET NULL") 并进行架构更新。

编辑:问题出在数据库级别而不是教义级别,级联="remove" 负责处理,page_id 的外键但是,保留,onDelete 指示如果删除具有该外部关系的列,请将该字段设置为 "value" 在这种情况下为空。如果你 --dump-sql 在模式更新之前你会看到查询添加,类似于“ON DELETE SET *”

可以在此处找到更多信息: http://www.techonthenet.com/oracle/foreign_keys/foreign_null.php

/**
 * @ORM\OneToMany(targetEntity="Background", mappedBy="page", orphanRemoval=true)
 * @ORM\OrderBy({"id" = "ASC"})
 */
protected $customBackgrounds;

应该可以解决问题 (Doctrine - Orphan Removal)