我有两张桌子。我想建立一对多的关系,但也要建立多对一的关系。
页面可以有一个背景 - 这是页面的背景。
一个页面也可以有很多背景 - 这是一组用户上传的背景,其中一个将被选为第一个关系。
换句话说,用户从一堆预定义的背景中选择一个背景,或者他上传的许多背景中的一个用于尝试。
编辑:删除背景时,我希望所有具有该background_id的页面都将background_id设置为null。删除页面时,我希望删除属于该页面的所有自定义背景。
虽然doctrine和symfony允许上述配置,但在删除页面时,Doctrine会忽略cascade =" {remove}"完全在Backgrounds属性上,当然在尝试删除页面时会引发异常,然后再删除它的自定义背景。
我做错了什么?
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;
}
答案 0 :(得分:4)
试
@ORM\JoinColumn(name="page_id",referencedColumnName="id", onDelete="SET NULL")
并进行架构更新。
编辑:问题出在数据库级别,而不是在学说,cascade =" remove"注意,page_id的外键保持不变,onDelete指示如果删除具有该外部关系的列,则将该字段设置为" value"这种情况是null。如果您在架构更新之前使用--dump-sql,那么您会看到添加的查询,类似于" ON DELETE SET *"
更多信息可以在这里找到: http://www.techonthenet.com/oracle/foreign_keys/foreign_null.php
答案 1 :(得分:0)
您可以做的唯一事情就是在您的实体中使用事件监听器,并在删除页面时将其背景设置为null或其他ID
答案 2 :(得分:0)
/**
* @ORM\OneToMany(targetEntity="Background", mappedBy="page", orphanRemoval=true)
* @ORM\OrderBy({"id" = "ASC"})
*/
protected $customBackgrounds;
应该做的伎俩(Doctrine - Orphan Removal)