【发布时间】:2014-09-02 09:19:29
【问题描述】:
尝试级联删除具有一对一和一对多双向关系的实体时,我遇到了外部约束违规。 这是我以这种方式关联的四个实体:“用户”对象可能有零个或一个“联系人”。联系人可能有零个或一个“地址”和零个或多个“电话”。但“联系人”必须与“用户”实体相关,“地址”和“电话”必须与“联系人”实体相关。
我的目标是,当我删除“用户”时,所有子对象也被级联删除(“联系人”、“地址”和“电话”)。但是,当我删除一个子对象时,我只想将其在父实体中的引用 id 设置为 NULL。
我尝试了几种方法,包括 onDelete="CASCADE" 和 onDelete=NULL 选项,但我仍然收到外部约束违规错误。
用户实体
class User
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* Contact
*
* @ORM\OneToOne(targetEntity="Contact", mappedBy="user", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=true)
*/
private $contact;
...
}
联系实体
class Contact
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* Address
*
* @ORM\OneToOne(targetEntity="Address", mappedBy="contact", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=true)
*/
private $address;
/**
* Telephones
*
* @ORM\OneToMany(targetEntity="Telephone", mappedBy="contact", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=true)
*/
private $telephones;
/**
* User
*
* @ORM\OneToOne(targetEntity="User", inversedBy="contact", cascade={"persist"})
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
*/
private $user;
/**
* Constructeur
*/
public function __construct()
{
$this->telephones = new ArrayCollection();
}
...
}
地址实体
class Address
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="Contact", inversedBy="address", cascade={"persist"})
* @ORM\JoinColumn(name="contact_id", referencedColumnName="id", nullable=false)
*/
private $contact;
...
}
电话实体
class Telephone
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Contact", inversedBy="telephones", cascade={"persist"})
* @ORM\JoinColumn(name="contact_id", referencedColumnName="id", nullable=false)
*/
private $contact;
...
}
【问题讨论】:
-
到底是什么错误
-
"无法删除或更新父行:外键约束失败 (
eds.eds_contact, CONSTRAINTFK_E2314CF8FB88E14FFOREIGN KEY (user_id) REFERENCESeds_user(id))"
标签: php symfony doctrine-orm