学说一对多的关系和多对一的关系

时间:2015-03-04 03:12:09

标签: php symfony doctrine-orm cascade relationships

我有两张桌子。我想建立一对多的关系,但也要建立多对一的关系。

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

一个页面也可以有很多背景 - 这是一组用户上传的背景,其中一个将被选为第一个关系。

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

编辑:删除背景时,我希望所有具有该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;
}

3 个答案:

答案 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