Removing children from entity with self-referencing One-to-Many association
doctrine-orm, mapping, self-reference, symfony
Solution
Use this:
/**
* @ORM\ManyToOne(
* targetEntity="User",
* inversedBy="children",
* cascade={"persist", "remove"}
* )
*
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="SET NULL")
*/
What `onDelete="SET NULL"` does is that when you delete a parent, its child element will get NULL value in parent_id column. This happens on DB level so you must doctrine:schema:update.
Problem
I have a self-referencing One-to-Many association on an entity (User) mapped by 'parent' and inversed by 'children'. I want to be able to remove users that are not parents. My entity is declared as follows. ``` 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(); } } ``` When I try to remove a child user that is not a parent, I am getting the following error. exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails I have tried doing a cascade delete, as follows. ``` /** * @ORM\OneToMany(targetEntity="User", mappedBy="parent", cascade={"persist", "remove"}) */ protected $children; ``` Getting the same error either way. Any help?