Alzeo
Alzeo

Reputation: 5

Foreign key and cascade problems on delete Symfony4

An entity project can have many personnages, many chapitres, one highConcept for each project. And the user can have many projects. Then, when I want to remove a project I have this error message :

An exception occurred while executing 'DELETE FROM projets WHERE id = ?' with params [2]:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (writtle.personnages, CONSTRAINT FK_286738A6C18272 FOREIGN KEY (projet_id) REFERENCES projets (id))

this is my entities:

Personnages Entity

/**
     * @ORM\ManyToMany(targetEntity="App\Entity\Chapitre", mappedBy="personnages")
     * @ORM\JoinColumn(name="projet_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $chapitres;

  /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Projets", inversedBy="personnages")
     * @ORM\JoinColumn(name="projet_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $projet;

Projet entity

/**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="projets")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Personnages", mappedBy="projet")

     */
    private $personnages;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Chapitre", mappedBy="projet", cascade={"remove"})
     * @ORM\joinColumn(onDelete="SET NULL")
     */
    private $chapitres;

Chapitre entity

 /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Projets", inversedBy="chapitres")
     */
    private $projet;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Personnages", inversedBy="chapitres")
     */
    private $personnages;

HighConcept


/**
     * @ORM\OneToOne(targetEntity="App\Entity\Projets", cascade={"persist", "remove"})
     */
    private $projet;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="highconcepts")
     */
    private $user;

User entity

/**
     * @ORM\OneToMany(targetEntity="App\Entity\Projets", mappedBy="user")
     */
    private $projets;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Highconcept", mappedBy="user")
     */
    private $highconcepts;

I don't know how I can relate this, I tried some things like JoinColumn ondelete cascade... I see some topics, but I think I use it correctly.

Upvotes: 0

Views: 466

Answers (1)

Pierrick Rambaud
Pierrick Rambaud

Reputation: 2364

Considering that you want to remove all the entities contained in your project I suggest you to use the orphanRemoval option as explained in the Doc.

There is another concept of cascading that is relevant only when removing entities from collections. If an Entity of type A contains references to privately owned Entities B then if the reference from A to B is removed the entity B should also be removed, because it is not used anymore.

making the members of your entity look like:

/**
* @ORM\OneToMany(targetEntity="App\Entity\Personnages", mappedBy="projet", orphanRemoval=true)
*/
private $personnages;

Upvotes: 1

Related Questions