Einius
Einius

Reputation: 1382

Removing related entity Symfony2

I have related entities. Many to Many relation and the annotation exists on only one entity:

/**
 * @ORM\ManyToMany(targetEntity="Event")
 * @ORM\JoinTable(name="viewed_events",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="event_id", referencedColumnName="id")}
 *      )
 **/
protected $viewedEvents;

The problem is when I try to delete Event entity I get Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails error. How do I solve this? I tried adding orphanRemoval=true like that: @ORM\ManyToMany(targetEntity="Event", orphanRemoval=true) and also tried adding cascade="delete" and cascade="all" instead with no success.

Upvotes: 0

Views: 180

Answers (2)

BentCoder
BentCoder

Reputation: 12730

I give you one simple example so that you can work out what you need to add/change in your application.

Assume that there is a M-N relationship between Student and Course entities.

STUDENT

class Student
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="StudentCourse", mappedBy="studentInverse", cascade={"persist", "remove"})
     */
    protected $studentInverse;

    public function __construct()
    {
        $this->studentInverse = new \Doctrine\Common\Collections\ArrayCollection();
    }
}

COURSE

class Course
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="StudentCourse", mappedBy="courseMap", cascade={"persist", "remove"})
     */
    protected $courseInverse;

    public function __construct()
    {
        $this->courseInverse = new \Doctrine\Common\Collections\ArrayCollection();
    }
}

STUDENTCOURSE (this the one you're more interested in)

class StudentCourse
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Course", inversedBy="courseInverse")
     * @ORM\JoinColumn(name="course", referencedColumnName="id", nullable=false, onDelete="CASCADE")
     */
    protected $courseMap;

    /**
     * @ORM\ManyToOne(targetEntity="Student", inversedBy="studentInverse")
     * @ORM\JoinColumn(name="student", referencedColumnName="id", nullable=false, onDelete="CASCADE")
     */
    protected $studentMap;
}

Upvotes: 2

Damonsson
Damonsson

Reputation: 1532

onDelete="CASCADE"

On Yours JoinColumn.

Upvotes: 1

Related Questions