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)
我有两张桌子。我要建立一对多关系,还要建立多对一关系
一个页面可以有一个背景 - 这是页面的背景。
一个页面也可以有很多背景 - 这是用户上传的背景集合,将从中选择一个作为第一个关系。
换句话说,用户从一堆预定义的背景中选择一个背景,或者从他上传的许多背景中选择一个来试用。
编辑:删除背景时,我希望所有带有 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)