我在'父'映射的实体(用户)上有一个自引用的一对多关联,并由'children'反转。我希望能够删除不是父母的用户。我的实体声明如下。
class User implements UserInterface
{
/**
* @ORM\Column(name="id", type="smallint")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
(...)
/**
* @ORM\OneToMany(targetEntity="User", mappedBy="parent")
*/
protected $children;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
*/
protected $parent;
public function __construct()
{
$this->parentId = null; // Default value for column parent_id
$this->children = new ArrayCollection();
}
}
当我尝试删除不是父级的子用户时,我收到以下错误。
异常'PDOException',消息'SQLSTATE [23000]:完整性约束违规:1451无法删除或更新父行:外键约束失败
我尝试过级联删除,如下所示。
/**
* @ORM\OneToMany(targetEntity="User", mappedBy="parent", cascade={"persist", "remove"})
*/
protected $children;
以任何方式获得相同的错误。有什么帮助吗?
答案 0 :(得分:9)
使用此:
/**
* @ORM\ManyToOne(
* targetEntity="User",
* inversedBy="children",
* cascade={"persist", "remove"}
* )
*
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="SET NULL")
*/
onDelete="SET NULL"
的作用是当你删除父元素时,它的子元素将在parent_id列中获得NULL值。这发生在数据库级别,因此您必须学习:schema:update。
答案 1 :(得分:0)
最后,我设法删除子类别,同时保留父类别:
$parent = $em->getRepository('Category\Entity\Category')->find(1);//parent id
$child = $em->getRepository('Category\Entity\Category')->find(5);// child id
$parent->removeChild($child);
$em->persist($child);
$em->remove($child);
$em->persist($parent);
$em->flush();
答案 2 :(得分:-1)
cascade
必须位于owning side:
/**
* @ORM\ManyToOne(
* targetEntity="User",
* inversedBy="children",
* cascade={"persist", "remove"}
* )
*/
protected $parent;